すごく初歩的なことで恥ずかしいんですけど、よろしくおねがいします。
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++から怒られてしまうし。
どなたか助けてください。
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
*/
> Cならsprintf, sscanf、
sprintfは関係ありませんでした。
monkeyさん、どうもありがとうございます。
教えて頂いたとおり、うまく答えが出せました。
それで次の悩みが出てきてしまって。。。
intの49と50を排他的論理和すると3になるんですが
intの45と32を排他的論理和すると13になってしまいます。
パソコンについてる関数電卓では77が出てきているんですけど。
何故こうなるのか思い浮かばなくて、77が出てきて欲しいんですけど
たびたびすみませんが、ヨロシクオネガイシマス。
> intの45と32を排他的論理和すると13になってしまいます。
正しい結果だと思いますが。
機械に頼らずに、紙と鉛筆とあなたの頭脳で確かめてみて下さい。
0010 1101
XOR 0010 0000
--------------
0000 1101
> 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
> パソコンについてる関数電卓では77が出てきているんですけど。
WindowsXp の関数電卓だと、ちゃんと45 Xor 32 = 13になりますよ。
# 45 + 32 = 77
みなさんありがとうございます。
ほんとに機械に頼りっきりで・・・
私の勘違いでした。おりがとうございました。