我正在面对一段代码,其中有一些非常特殊的操作,例如:
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
这是什么意思:
((value << 32) >> 32)
?如果值类型为64位,那么这是否与
value
相同呢?我正在面对一段代码,其中有一些非常特殊的操作,例如:
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
((value << 32) >> 32)
?value
相同呢?这是和
value
一样的吗?
不是。
因为零被移入了 (value << 32) >> 32),所以高位的32位被丢弃了。
(value << 32) >> 32)
是底部的32位
value >> 32
是顶部的32位
[假设你从一个64位类型开始。如果你有一个32位类型,那么它是未定义的行为]
value
的类型没有重载operator>>
。 - Gorpikvalue << 32
是被定义良好的;其值为0。 - Pete Becker>>
运算符时,是否会将零位移入取决于类型和实现方式。如果有一个48位类型,那该怎么办? - James Kanze这段代码旨在将一个无符号64位整数(uint64_t)分成两部分:
低位组件(位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是有符号整数,则可能无法得到预期的答案。
value
的类型为64位整数时,(value << 32) >> 32)
将返回其“最右侧”的32位!
return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );
实际上将一个64位整数分成两个32位的部分 ;)看起来这段代码试图将一个64位数字分割成高32位字和低32位字。
如果我们假设value
是一个无符号的64位整数,则:
value >> 32
这是最重要的32位字(底部32位溢出到末尾,因为高位字被移动到低位字位置)。
(value << 32) >> 32
最不重要的32位字将被塞入高位部分(挤掉现有的高位部分),然后移回到低32位节。这也可以通过以下方式实现:
value & 0xFFFFFFFF
<<
和 >>
是位运算符。
它们将数字的位向右移 >>
或向左移 <<
。
对于 64 位整数:
value >> 32 = top 32 bits.
(value << 32) >> 32 = bottom 32 bits.
假设你所说的数值是64位长,那么这个表达式将会使value
被截取,以便用0来填充“最左边”的32位:
比如说,value
是:
0xA3B252A2ADAEACA0
那么 value << 32
就是:
0xADAEACA000000000
而 (value << 32) >> 32
就是:
0x00000000ADAEACA0
你的std::pair
的第一部分是 value << 32
,它将会相反操作,只返回value
的“最左边”的一半:
0x00000000A3B252A2
你的指令行将把你的64位拆成两个连续的32位数值。