我面临的代码对我来说有这样一个非凡的操作:
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
这是什么意思:( (value << 32) >> 32)
。
这和刚才一样value
吗?(对我来说,值类型的大小为 64 位时是合理的)
我面临的代码对我来说有这样一个非凡的操作:
return std::pair<T1, T2>(value >> 32, ( (value << 32) >> 32) );
这是什么意思:( (value << 32) >> 32)
。
这和刚才一样value
吗?(对我来说,值类型的大小为 64 位时是合理的)
这和刚才一样
value
吗?
不。
因为零被移入 (value << 32) >> 32) 丢弃前 32 位。
(value << 32) >> 32)
是底部 32 位
value >> 32
是前 32 位
[假设您从 64 位类型开始。如果您有 32 位类型,那么这是未定义的行为]
该代码可能旨在将无符号 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 是有符号整数,您可能无法得到预期的答案。
当value
's 的类型是 64 位整数时,(value << 32) >> 32)
将返回它的“最右边”的 32 位!
return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );
实际上将一个 64 位整数拆分为两个 32 位部分;)
<<
并且>>
是按位操作数。
它们将数字的位向右>>
或向左移动<<
。
对于 64 位整数:
value >> 32 = top 32 bits.
(value << 32) >> 32 = bottom 32 bits.
看起来这段代码试图将一个 64 位数字拆分为一个高 32 位字和一个低 32 位字。
如果我们假设它value
是一个无符号的64 位整数,那么:
value >> 32
是最重要的 32 位字(当高位字移入低位字位置时,底部 32 位溢出末端)。和:
(value << 32) >> 32
是最低有效的 32 位字被撞到高位部分(从现有的高位部分撞出),然后向下移回低 32 位部分。这也可以通过说明来实现:
value & 0xFFFFFFFF
如您所说,如果您的值是 64 位长,则此表达式将剪切value
以便用 0 填充“最左侧”的 32 位:
假设value
是:0xA3B252A2ADAEACA0
然后value << 32
是:0xADAEACA000000000
并且(value << 32) >> 32
是:0x00000000ADAEACA0
你的第一部分std::pair
是value << 32
,它会做相反的事情,只返回“最左边”的一半value
:0x00000000A3B252A2
您的指令行会将您的 64 位切割成两个 32 位连续值。