java - 为什么在对结果求和之前需要左移?

标签 java bit-manipulation

这是一个按预期工作的代码片段,它正确地反转整数的位并返回新的 int。我的问题是为什么 result <<= 1 行必须在我对操作 n&1 求和结果之前发生?

在第一次迭代中,它不会影响结果,因为结果被实例化为 0。如果我输入 result <<= 1在 for 循环末尾的行中,在将结果与 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;
}

最佳答案

在第一次迭代中,它确实没有任何效果,但没关系,这是有意的。这比写 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;
}

关于java - 为什么在对结果求和之前需要左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60256557/

相关文章:

bit-manipulation - 理解C中按位运算符的问题

c - 如何仅使用移位和加法进行乘法和除法?

c++ - 使用 bitset 代替手写位操作代码?

java - 有没有办法让Intellij在我刚刚提取参数时用方法替换重复代码?

java - Java中用于链接文本和音频的数据结构

java - 可以使用java中的包装类交换两个数字而不创建任何其他类吗?

java - How to parse a Java Date to customized string format like "17^th of Jan 2014"('th' is a superscript)

java - “Cannot find symbol”或 “Cannot resolve symbol”错误是什么意思?

java - 每个枚举项的编号?

将32位 float 转换为64位uint64_t