【发布时间】:2014-07-31 10:31:02
【问题描述】:
我偶然发现了一个问题,询问是否you ever had to use bit shifting in real projects。我在许多项目中都广泛使用了位移,但是,我从来不必使用算术位移,即位移左操作数可能是负数和符号位应移入而不是零。例如,在 Java 中,您将使用 >> 运算符进行算术位移(而 >>> 将执行逻辑移位)。经过深思熟虑,我得出的结论是,我从未使用过带有可能为负左操作数的>>。
正如this answer 中所述,算术移位甚至是在 C++ 中定义的实现,因此——与 Java 相比——C++ 中甚至没有用于执行算术移位的标准化运算符。答案还指出了一个有趣的问题,即我什至不知道的负数移位问题:
+63 >> 1 = +31 (integral part of quotient E1/2E2)
00111111 >> 1 = 00011111
-63 >> 1 = -32
11000001 >> 1 = 11100000
所以-63>>1 产生-32,这在查看位时很明显,但可能不是大多数程序员第一眼所期望的。更令人惊讶(但在查看这些位时再次明显)是 -1>>1 是 -1,而不是 0。
那么,可能负值的算术右移的具体用例是什么?
【问题讨论】:
-
但是等等,
>>是算术移位。>>>是逻辑移位。 -
@harold:哦,对了,谢谢,已更正
-
这个问题已经很老了。这些天来,一切都被投票关闭。顺便说一句,在某些情况下,算术移位对于将位转换为全角掩码很有用。
-
@Jongware:它是 int 除以二,也就是说,当您使用
a/2和a是几乎所有编程语言中的整数类型时,您会得到什么。 -
@JoopEggen 是的,它是通过将
>>转换为>>>来解决的,所以它确实是不 使用>>
标签: java c++ bit-manipulation bit-shift sign-extension