2017-10-02 13 views
4

ここで、「 - 」は負のxを示し、「&」はビットごとのANDを示します。2の補数におけるx&(-x)の意義?

数字はプログラム内で8ビットの2の補数であり、入力と出力の相関を見つけることができないようです。

8 & (-8) = 8 
7 & (-7) = 1 
97 & (-97) = 1 

おそらく重要なのはビット操作ですか?上記の各場合において

0000 1000 & (1111 1000) = 0000 1000 
0000 0111 & (1111 1001) = 0000 0001 
0110 0001 & (1001 1111) = 0000 0001 

上位4ビットは常に0になってしまうが、私は、入力及びどの下位4ビットになってしまうとの間の相関を見つけることができません。

アイデア? ANSWERED

Find the lowest set bit

+1

もう少し変形してみてください。あなたはほとんどそこにいるので、十数例から模様を見つけられると確信しています。 – doynax

+0

コンピュータの近くでは、これに対する答えを見るのを待って、私の頭の中でそれを解決することはできません!フリップビットと追加1は何が起こっているのか –

+3

これは最も低いセットビットを分離し、これは前に答えられています。 .. – harold

答えて

0

2の補数は、定義上で1の補数(全てのビットが反転)を加えたものに等しいです。

&とその1の補数だけを行う場合は、常に0000 0000となります。

パターンを理解するための鍵は、ここにあります:+ 1操作が他のビットまたは最後のビットだけを変更する場合。つまり、最後に1があり、+1加算後にリマインダーが伝播する場合もあります。

1

2の補数は、数値の1の補数に1を加えたものに等しくなります。8の1の補数に1を加算する方法を見てみましょう。

ここ
8 -> 00001000 (bin) -> 11110111 (oc) -> 11111000 (tc) 

、それの右側にそのビットのビットを反転、最初0に達するまで、1の補数を介してどのように追加1つの移動に気づきます。また、1の補数における最初の0の位置は、元の2進表現における最初の1の位置でもあることにも注意してください。

x & (-x)では、xの最初の1の左側のビットは、すべて1の補数を取ってからまだ反転されているため、0になります。そして、最初の1の右側のビットも、xでは0であったため、0になります(そうでない場合、最初の1は前になります)。

したがって、x & (-x)の出力は、xの最初の1の位置に対応する2の累乗になります。

関連する問題