以下が 1 を返す理由がわかりません。
0x0102 && (0xff << 8)
0xff
私の理解では、左に 8ビットシフトすると0x00
; そして、anding
それは何でも0x00になります。どこが間違っていますか?
以下が 1 を返す理由がわかりません。
0x0102 && (0xff << 8)
0xff
私の理解では、左に 8ビットシフトすると0x00
; そして、anding
それは何でも0x00になります。どこが間違っていますか?
logical AND
ではなく、を使用していbitwise AND
ます。に置き換え&&
ます&
。
試す
0x0102 & (0xff << 8)
私の理解では、0xff を左に 8 ビットシフトすると 0x00 になります。これを何かと AND すると、0x00 になります。どこが間違っていますか?
0xFF はint
. 通常、コンパイラの設定に応じて、16 ビットまたは 32 ビットです。したがって、左に 8 ビットシフトすると、 が得られ0xFF00
ます。
(0xff << 8)
になります0xff00
。とビット単位の AND 演算を行うと、結果0x0102
が得られます0x0100
(これは ですtrue
)。
ただし、ビットごとの AND を実行していません。&&
論理積です。&
はビットごとの AND です。基本的にやっていることif 0x0102
はtrue
AND if (0xff << 8)
is ですtrue
。これは、引数がゼロ以外であるため、結果はtrue
(1 に変換されます) になります。
&&
論理積です。&
たとえば、ビットごとの AND が必要です
0x0102 & (0xff << 8)
また、ビットごとの算術演算はバイトではなく整数であるため0xff
、左に 8ビット シフトすると になります。0xff00
整数定数は、単純な 8 ビットで0xFF << 8
は構成されません0xFF00
。
In Cを参照左シフト (char) 0xFF を 8 ずつ int にキャスト
0xff << 8 は -256 を返します。AND 論理ゲートの両側は 0 ではないため、true または 1 を返します。