ゲイル・ラークマン・マクダウェルによる本「コーディングのインタビューを割る」を読んで、ビット操作の章で、質問を投稿します。
の値を見つけます (数値が 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 ではなく11112または0xF16です。1111左に 2 回シフトすると1100(左端の 2 ビットが削除され、右から 0 が埋められます)。1011 & 1100と、対応するビット位置が 1 である各ビット位置で 1 が得られ、それ以外の場合は 0 になります。これにより、結果は になり1000ます。