将 32 位整数中的所有位取反而产生错误输出的代码是什么?

What is my code for inverting all the bits in a 32 bit integer producing the incorrect output?

这是一道黑客等级练习题(非竞赛题)https://www.hackerrank.com/challenges/flipping-bits。这样做只是为了练习。
该问题只是要求您为 32 位整数取一组数字,并且对于每个整数,反转该整数内的所有位并打印出结果 到目前为止,这是我的代码

 static long getComplement(long c) {
    long complement = 0;
    for(int k = 31; k >= 0 ; k --) {
        long evaluateBit = c >> k;
        if(evaluateBit == 1) {
            evaluateBit = 0;
        }  else {
            evaluateBit = 1;
        }
        complement += evaluateBit << k;
     }
    return complement;
}

这是我的高级伪代码思路。我将评估整数中的每一位。为此,我必须将位右移它的位置(位置 31 的东西必须右移 31 才能到达位置 0,以便我可以评估它)。这就是为什么我的循环从 31 开始并在 0 结束。然后一旦我得到那个位置的位,我将用条件语句反转它,然后将结果左移相同的结果。我最终会将它添加到我保留的总和中(0 * 2 ^ 31 将由 1 * 2 ^ 31 组成)

有人看到我的伪代码有什么问题吗?

一定是有问题,因为当我尝试 运行 宁我 IDE 中的代码时,这是我调试代码 [=14= 时得到的结果]

我尝试使用输入 0 进行测试 运行。 在我的第一个 运行(k=31) 之后,我不知何故得到了一个负数。有谁知道问题出在哪里或我该如何解决?

我确保我也使用了右移运算符,来自 How do shift operators work in Java?

您的第一次迭代将最左边的位从 0 更改为 1。这是符号位,因此您得到的当然是负数。

编辑:

改变

evaluateBit = (c >> k);

evaluateBit = (c >> k) & 1;

为了让evaluateBit真正包含一个位的值。