首页 > 解决方案 > 为什么在对结果求和之前需要左移?

问题描述

这是一个按预期工作的代码片段,它正确地反转整数的位并返回新的 int。我的问题是为什么result <<= 1在我将结果与操作相加之前必须出现这条线n&1

在第一次迭代中,它不会影响结果,因为结果被实例化为 0。如果我将这result <<= 1一行放在 for 循环的 END 处,在将结果与 求和之前,我仍然会左移结果n&1。我的代码,最后是左移结果,不起作用,我似乎无法理解这最后一步。

public int reverseBits(int n) {
    int result = 0;
    for(int i=0; i<32; i++){
        result <<= 1;
        result += n&1;
        n >>= 1;
    }
    return result;
}

标签: javabit-manipulation

解决方案


在第一次迭代中,它确实没有任何效果,但没关系,这是有意的。这比写作要好if (i != 0) result <<= 1;。在每次迭代中检查这一点是低效的。但同样重要的是要注意这一点,基本上在 32 次迭代中只有在 31 次才会产生效果并且应该。因此,如果你把这result <<= 1;行放在最后,而不是确保它只有效执行 31 次,还要记住,现在它应该在顺序更改后的第一次迭代中执行,但不应该在最后一次迭代中执行。这就是结果无效的原因。

尝试这个。这将起作用。

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;
}

推荐阅读