Java 为什么我需要在求和结果之前左移?

Java 为什么我需要在求和结果之前左移?,java,bit-manipulation,Java,Bit Manipulation,这是一个按预期工作的代码片段,它正确地反转整数的位并返回新的int。我的问题是,为什么行会产生,因为否则您操作的位是错误的。注意:如果有帮助的话,您可以用简单的算术和除法替换当前的位移位。像 public static int reverseBits(int n) { int result = 0; for (int i = 0; i < 32; i++) { result += result + (n & 1); n /= 2;

这是一个按预期工作的代码片段,它正确地反转整数的位并返回新的int。我的问题是,为什么行
会产生,因为否则您操作的位是错误的。注意:如果有帮助的话,您可以用简单的算术和除法替换当前的位移位。像

public static int reverseBits(int n) {
    int result = 0;
    for (int i = 0; i < 32; i++) {
        result += result + (n & 1);
        n /= 2;
    }
    return result;
}
得到

result += result + (n & 1);
对于
>>=1
,这与
/2
相同


1数学。

在第一次迭代中,它确实没有效果,但这没关系,这是有意的。如果(i!=0)结果这是一个一次性问题,那么编写
比编写
要好:

  • 您需要复制32位,因此您正在执行32
    result+=n&1操作(0..31)
  • 要将最右边的位(位置0)移动到最左边的位置(位置31),只需执行31左移位操作

因此,将
结果>=1,您也可以执行32次右移操作,但最终的右移并不重要,因为它从未添加到结果中(无论如何为零)。

它不是“需要的”,只是更容易保留,因为在后续迭代中需要它。如果它放在循环的末端(内部),则必须在循环的外部/之后撤消。(也可能会丢失第一位)不知何故,这可以与求和值进行比较,我们通常使用第一次迭代不需要的
sum=sum+value
(或
sum+=value
),只是更容易让它出现
result <<= 1;
result += n&1
result += result + (n & 1);
public int reverseBits(int n) {
    int result = 0;
    for(int i=0; i<32; i++){
        result += n&1;
        n >>= 1;
        if (i != 31) // skip the shift in last iteration
            result <<= 1;
    }
    return result;
}