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

注意:如果 val 是有符号整数,您可能无法得到预期的答案。

于 2013-09-20T12:09:27.693 回答
4

value's 的类型是 64 位整数时,(value << 32) >> 32)将返回它的“最右边”的 32 位!

return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );实际上将一个 64 位整数拆分为两个 32 位部分;)

于 2013-09-20T11:56:37.317 回答
3

<<并且>>是按位操作数。

它们将数字的位向右>>或向左移动<<

对于 64 位整数:

value >> 32 = top 32 bits.
(value << 32) >> 32 = bottom 32 bits.
于 2013-09-20T11:58:27.157 回答
3

看起来这段代码试图将一个 64 位数字拆分为一个高 32 位字和一个低 32 位字。

如果我们假设value是一个无符号的64 位整数,那么:

value >> 32

是最重要的 32 位字(当高位字移入低位字位置时,底部 32 位溢出末端)。和:

(value << 32) >> 32

是最低有效的 32 位字被撞到高位部分(从现有的高位部分撞出),然后向下移回低 32 位部分。这也可以通过说明来实现:

value & 0xFFFFFFFF
于 2013-09-20T11:56:37.057 回答
2

如您所说,如果您的值是 64 位长,则此表达式将剪切value以便用 0 填充“最左侧”的 32 位:

假设value是:0xA3B252A2ADAEACA0

然后value << 32是:0xADAEACA000000000

并且(value << 32) >> 32是:0x00000000ADAEACA0

你的第一部分std::pairvalue << 32,它会做相反的事情,只返回“最左边”的一半value:0x00000000A3B252A2

您的指令行会将您的 64 位切割成两个 32 位连续值。

于 2013-09-20T12:00:01.580 回答