什么(值<<< 32)>> 32意味着什么

时间:2013-09-20 11:53:44

标签: c++

我正面对代码,对我来说有一个非常类似的操作:

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

这是什么意思:( (value << 32) >> 32)

这和value一样吗? (对我来说,当值类型的大小是64位时是合理的)

6 个答案:

答案 0 :(得分:5)

  

这是否仅与value相同?

没有

因为零移入(值<&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt 32)丢弃前32位。

(value << 32) >> 32)是最低32位

value >> 32是前32位

[假设您从64位类型开始。如果你有32位类型,那么它是未定义的行为]

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

<<>>是按位操作数。

他们将数字的位移到右>>或左<<

对于64位整数:

value >> 32 = top 32 bits.
(value << 32) >> 32 = bottom 32 bits.

答案 3 :(得分:2)

代码可能旨在将无符号的64位整数(uint64_t)拆分为2个部分:

低分量(位0 ... 31)

高分量(位32 .. 63)

val&gt;&gt; 32,将获得v。

的高成分

和(val&lt;&lt; 32)&gt;&gt; 32将获得v。

的低分量

val: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

val >> 32: 00000000000000000000000000000000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

val << 32: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 00000000000000000000000000000000

(val<<32)>>32: 0000000000000000000000000000000 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

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

答案 4 :(得分:1)

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

如果假设 value无符号 64位整数,那么:

value >> 32

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

(value << 32) >> 32

是最不重要的32位字,向上撞到高部分(撞击现有的高部分),然后向下移回到较低的32位部分。这也可以通过陈述:

来实现
value & 0xFFFFFFFF

答案 5 :(得分:1)

如果您的值为64位长,则此表达式将切割value以便用0填充“最左边”的32位:

假设value是:     0xA3B252A2ADAEACA0

然后value << 32是:     0xADAEACA000000000

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

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

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