(value << 32) >> 32 的意思是什么?

3

我正在面对一段代码,其中有一些非常特殊的操作,例如:

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

这是什么意思:((value << 32) >> 32)
如果值类型为64位,那么这是否与value相同呢?

2
哇,使用位运算和模板类型?!根据类型(short、uint、double),它可以有多个输出。 - lucasg
还有一个括号缺失。 - lucasg
1
这可能是危险的。按位移动整数其位数未定义,如果它们是32位值,则结果未定义。 - Neil Kirk
1
这意味着编写代码的人不理解位掩码,因此编写了一个糟糕的hack。 - Pete Becker
6个回答

7

这是和 value 一样的吗?

不是。

因为零被移入了 (value << 32) >> 32),所以高位的32位被丢弃了。

(value << 32) >> 32) 是底部的32位

value >> 32 是顶部的32位

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


1
假设value的类型没有重载operator>> - Gorpik
将整数按其位数移位是未定义的。如果它们是32位值,则结果是未定义的。 - Neil Kirk
如果您有一个32位类型,那么它是未定义的行为(实际上是我的小恶习)。 - john
在C++11中,对于32位类型,value << 32是被定义良好的;其值为0。 - Pete Becker
使用 >> 运算符时,是否会将零位移入取决于类型和实现方式。如果有一个48位类型,那该怎么办? - James Kanze
假设您从一个64位无符号类型开始。 - PP.

5

这段代码旨在将一个无符号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是有符号整数,则可能无法得到预期的答案。


4
value的类型为64位整数时,(value << 32) >> 32)将返回其“最右侧”的32位! return std::pair<T1, T2>(value >> 32, (value << 32) >> 32) );实际上将一个64位整数分成两个32位的部分 ;)

3

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

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

value >> 32

这是最重要的32位字(底部32位溢出到末尾,因为高位字被移动到低位字位置)。

(value << 32) >> 32

最不重要的32位字将被塞入高位部分(挤掉现有的高位部分),然后移回到低32位节。这也可以通过以下方式实现:

value & 0xFFFFFFFF

3

<<>> 是位运算符。

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

对于 64 位整数:

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

2

假设你所说的数值是64位长,那么这个表达式将会使value被截取,以便用0来填充“最左边”的32位:

比如说,value 是: 0xA3B252A2ADAEACA0

那么 value << 32 就是: 0xADAEACA000000000

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

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

你的指令行将把你的64位拆成两个连续的32位数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接