&(演算と)、|(または演算)、^(異または演算)の本質理解


int a=729;
int b=271;
printf("%d 
",(a & b) +(a ^ b)>>1); printf("%d
",(a & b) +(a | b));

出力結果:500;1000
(1)この問題はどうしてビット演算のように見えますか.一歩一歩ビット演算を行います.まさか、lowです.では、どんな近道がありますか.
(2)はい、この問題の意味を読みましょう.まず、いろいろなビット演算の本質を話しましょう.
&演算:10進数同位加算の1/2に相当
0101&0011結果:バイナリ0001 10進数(2^0+2^0)/2ここで"^"は次べき乗を表す
|演算:10進数同位位位位加算に相当する1/2と異なる同位加算加算加算和
0101|0011結果:バイナリ0111 10進数(2^0+2^0)/2+(2^2+2^1)
^演算:十進法に相当する同位体を加算する
0101^0011結果:バイナリ0110十進法(2^2+2^1)
(3)では,(2)に示す方法でこの問題を解いてみましょう
一つ目の出力結果の意味:729、271同じ位で加算をする1/2と729、271とは異なる位で加算をする1/2(右シフト1位は除算2に相当)の和を求めます.あら、この意味は729と271で平均数を求めるのではないでしょうか.OK、結果は500です.
2番目の出力結果の意味:729,271同じ位で加算をした1/2729,271同じ位で加算をした1/2729,271が同位で加算をした3つの結果の和,やれやれ,この意味は729と271の和ではないか,OK結果は1000である.
(4)よし、&(演算と)、|(演算)、^(異或演算)の本質を身につけると、後でこのような問題に触れると瞬時に秒殺できる