我正面对代码,对我来说有一个非常类似的操作:
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
这是什么意思:( (value << 32) >> 32)
。
这和value
一样吗? (对我来说,当值类型的大小是64位时是合理的)
答案 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位连续值。