私は、次のような異常な操作があるコードに直面しています。
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
これはどういう意味ですか: ( (value << 32) >> 32)
.
これはただと同じvalue
ですか?(私にとっては、値型のサイズが 64 ビットの場合は合理的です)
私は、次のような異常な操作があるコードに直面しています。
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
これはどういう意味ですか: ( (value << 32) >> 32)
.
これはただと同じvalue
ですか?(私にとっては、値型のサイズが 64 ビットの場合は合理的です)
これはただと同じ
value
ですか?
いいえ。
ゼロがシフトインされるため (value << 32) >> 32) は上位 32 ビットを破棄します。
(value << 32) >> 32)
下位32ビットです
value >> 32
は上位 32 ビットです
[これは、64 ビット型から始めることを前提としています。32ビット型の場合、未定義の動作です]
コードは、符号なし 64 ビット整数 ( uint64_t ) を 2 つの部分に分割することを目的としている可能性があります。
下位コンポーネント (ビット 0 .. 31 )
そして上位コンポーネント (ビット 32 .. 63 )
val >> 32 は、v の上位コンポーネントを取得します。
そして (val << 32) >> 32 は v の下位コンポーネントを取得します。
val: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
val >> 32: 00000000000000000000000000000000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
val << 32: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 00000000000000000000000000000000
(val<<32)>>32: 0000000000000000000000000000000 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
注意: if val が符号付き整数の場合、期待どおりの答えが得られない場合があります。
value
の型が 64 ビット整数の場合、その(value << 32) >> 32)
「右端」の 32 ビットが返されます!
return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );
実際には、64 ビット整数を 2 つの 32 ビット部分に分割します ;)
このコードは、64 ビットの数値を上位 32 ビット ワードと下位 32 ビット ワードに分割しようとしているようです。
これが符号なし64 ビット整数であると仮定すると、次のようになります。value
value >> 32
は最上位の 32 ビット ワードです (上位ワードが下位ワード位置にシフトされると、下位 32 ビットが最後から溢れ出します)。と:
(value << 32) >> 32
最下位の 32 ビット ワードが上位部分にラムアップされ (既存の上位部分から突き出され)、下位 32 ビット セクションに戻されます。これは、次のように記述することによっても達成できます。
value & 0xFFFFFFFF