3

私は、次のような異常な操作があるコードに直面しています。

return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );

これはどういう意味ですか: ( (value << 32) >> 32).

これはただと同じvalueですか?(私にとっては、値型のサイズが 64 ビットの場合は合理的です)

4

6 に答える 6

7

これはただと同じvalueですか?

いいえ。

ゼロがシフトインされるため (value << 32) >> 32) は上位 32 ビットを破棄します。

(value << 32) >> 32)下位32ビットです

value >> 32は上位 32 ビットです

[これは、64 ビット型から始めることを前提としています。32ビット型の場合、未定義の動作です]

于 2013-09-20T11:56:19.897 に答える
5

コードは、符号なし 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 が符号付き整数の場合、期待どおりの答えが得られない場合があります。

于 2013-09-20T12:09:27.693 に答える
4

valueの型が 64 ビット整数の場合、その(value << 32) >> 32)「右端」の 32 ビットが返されます!

return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );実際には、64 ビット整数を 2 つの 32 ビット部分に分割します ;)

于 2013-09-20T11:56:37.317 に答える
3

このコードは、64 ビットの数値を上位 32 ビット ワードと下位 32 ビット ワードに分割しようとしているようです。

これが符号なし64 ビット整数であると仮定すると、次のようになります。value

value >> 32

は最上位の 32 ビット ワードです (上位ワードが下位ワード位置にシフトされると、下位 32 ビットが最後から溢れ出します)。と:

(value << 32) >> 32

最下位の 32 ビット ワードが上位部分にラムアップされ (既存の上位部分から突き出され)、下位 32 ビット セクションに戻されます。これは、次のように記述することによっても達成できます。

value & 0xFFFFFFFF
于 2013-09-20T11:56:37.057 に答える