^演算(排他的論理和)の方法?

[戻る]
ショコレ 2004/12/11(土) 21:24:22
すごく初歩的なことで恥ずかしいんですけど、よろしくおねがいします。

int a=0x31,b=0x32;
int c;

c = a ^ b;

答え : 3

上のように直接intのa,bに16進数を入れてあげた場合には、^(排他的論理和)演算が
正しく出来るんですけど(intのa,bをchar型のa,bでも同じ結果は出せました。)
それを下に書いてあるchar配列"retu"から
それぞれ"31","32"と区切って、上に書きましたビット演算と同じ結果を
導き出すには、どういうすればいいのか解りません。

char retu[10] = "3132";

int型や、別のchar配列に"31"を取得することは出来たんですけど
"sprintf"の書式指定子を使って,char型の変数に
"0x31"っていう文字列を入れようとしても、エラーになっちゃうし
"strncpy"や"memcpy"でもVisial C++から怒られてしまうし。

どなたか助けてください。

monkey 2004/12/11(土) 22:24:45
Cならsprintf, sscanf、C++ならistringstreamを使うのがよさそうです。
いずれも2文字で1つの数値を表していることが前提です。

// Cの例:
#include <string.h>
#include <stdio.h>

int main( void )
{
    char retu[10] = "3132";
    char buff[10];
    int a, b, c;

    strncpy( buff, retu, 2 );
    sscanf( buff, "%x", &a );

    strncpy( buff, retu + 2, 2 );
    sscanf( buff, "%x", &b );

    c = a ^ b;

    printf( "a = %d, b = %d, c = %d\n", a, b, c );
    return 0;
}

/* 実行結果:
a = 49, b = 50, c = 3
*/


// C++の例:
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    std::string retu = "3132";
    std::istringstream iss( retu.substr( 0, 2 ) + " " + retu.substr( 2, 2 ) );

    int a, b;
    iss >> std::hex >> a >> b;

    int c = a ^ b;
    std::cout << "a = " << a << ", "
              << "b = " << b << ", "
              << "c = " << c << std::endl;
}

/* 実行結果:
a = 49, b = 50, c = 3
*/

monkey 2004/12/11(土) 22:33:28
> Cならsprintf, sscanf、

sprintfは関係ありませんでした。

ショコレ 2004/12/11(土) 22:38:06
monkeyさん、どうもありがとうございます。

教えて頂いたとおり、うまく答えが出せました。

それで次の悩みが出てきてしまって。。。

intの49と50を排他的論理和すると3になるんですが

intの45と32を排他的論理和すると13になってしまいます。

パソコンについてる関数電卓では"77"が出てきているんですけど。

何故こうなるのか思い浮かばなくて、"77"が出てきて欲しいんですけど
たびたびすみませんが、ヨロシクオネガイシマス。

monkey 2004/12/11(土) 22:55:21
> intの45と32を排他的論理和すると13になってしまいます。

正しい結果だと思いますが。
機械に頼らずに、紙と鉛筆とあなたの頭脳で確かめてみて下さい。

    0010 1101
XOR 0010 0000
--------------
    0000 1101

瀬戸っぷ [E-Mail] 2004/12/11(土) 23:00:57
> intの49と50を排他的論理和すると3になるんですが
> intの45と32を排他的論理和すると13になってしまいます。
> パソコンについてる関数電卓では"77"が出てきているんですけど。

本来ならばintで32Bitかも知れませんが、面倒なので8Bitで。

49=00110001
50=00110010
 3=00000011

45=00101101
32=00100000
13=00001101
正しいと思いますが。

45=00101101
32=00100000
77=01001101
コレは加算では??

# ってmonkeyさんの方が早かった。

# で、本題はナニがしたいのかイマイチ判らないんですけど……
# http://www.mtakahashi.com/cgi.cgi?12484

monkey 2004/12/11(土) 23:02:52
> パソコンについてる関数電卓では"77"が出てきているんですけど。

WindowsXp の"関数電卓"だと、ちゃんと"45 Xor 32 = 13"になりますよ。
# "45 + 32 = 77"

ショコレ 2004/12/11(土) 23:06:20
みなさんありがとうございます。

ほんとに機械に頼りっきりで・・・

私の勘違いでした。おりがとうございました。

古いスレッドには追加発言できません。