^演算(排他的論理和)の方法? – プログラミング – Home

^演算(排他的論理和)の方法?
 
通知
すべてクリア

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


ショコレ
 ショコレ
(@ショコレ)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

すごく初歩的なことで恥ずかしいんですけど、よろしくおねがいします。

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
 monkey
(@monkey)
ゲスト
結合: 20年前
投稿: 70
 

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
 monkey
(@monkey)
ゲスト
結合: 20年前
投稿: 70
 

> Cならsprintf, sscanf、

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


返信引用
ショコレ
 ショコレ
(@ショコレ)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

monkeyさん、どうもありがとうございます。

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

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

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

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

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

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


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 20年前
投稿: 70
 

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

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> 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
 monkey
(@monkey)
ゲスト
結合: 20年前
投稿: 70
 

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

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


返信引用
ショコレ
 ショコレ
(@ショコレ)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

みなさんありがとうございます。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました