ゲイル・ラークマン・マクダウェルによる本「コーディングのインタビューを割る」を読んで、ビット操作の章で、質問を投稿します。
の値を見つけます (数値が 4 ビットで表されると仮定します):
1011 & (~0 << 2)
ここで、~0 = 1 を左に 2 回シフトすると 100 (4 ビットを完了するには = 0100) になります。1011 に 0100 を足すと 0000 になります。
しかし、私が持っている答えは1000です。
ゲイル・ラークマン・マクダウェルによる本「コーディングのインタビューを割る」を読んで、ビット操作の章で、質問を投稿します。
の値を見つけます (数値が 4 ビットで表されると仮定します):
1011 & (~0 << 2)
ここで、~0 = 1 を左に 2 回シフトすると 100 (4 ビットを完了するには = 0100) になります。1011 に 0100 を足すと 0000 になります。
しかし、私が持っている答えは1000です。
~0
は 1 ではなく1111
(または0xf
) です。~
演算子はビット単位のNOT 演算子であり、論理演算子( !
) ではありません。
したがって、左に 2 桁シフトすると、最後の 4 ビットは1100
. そして1100 & 1011
正確1000
です。
~0
は 1 ではありません。0
はデフォルトで整数になり、NOT 演算は最初のビットだけでなくすべてのビットを逆にします。
~
ビットごとの補数演算子です。
の値は4 ビットで~0
なければなりません。1111
1011 & (~0 << 2)
= 1011 & ( 1111 << 2)
= 1011 & 1100
= 1000
1011 & (~0 << 2)
~0
は 1 ではなく1111
2または0xF
16です。1111
左に 2 回シフトすると1100
(左端の 2 ビットが削除され、右から 0 が埋められます)。1011 & 1100
と、対応するビット位置が 1 である各ビット位置で 1 が得られ、それ以外の場合は 0 になります。これにより、結果は になり1000
ます。