Java 我的代码是什么,用于反转32位整数中的所有位,从而产生不正确的输出?

Java 我的代码是什么,用于反转32位整数中的所有位,从而产生不正确的输出?,java,algorithm,integer,bit-manipulation,Java,Algorithm,Integer,Bit Manipulation,这是一个黑客等级练习问题(不是竞赛)。只是为了练习而已。 这个问题只是要求你为32位整数取一个设定的数字,然后对每个整数,反转该整数内的所有位并打印出结果 这是到目前为止我的代码 static long getComplement(long c) { long complement = 0; for(int k = 31; k >= 0 ; k --) { long evaluateBit = c >> k; if(evalua

这是一个黑客等级练习问题(不是竞赛)。只是为了练习而已。
这个问题只是要求你为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;
}
静态长getcomplete(长c){
长补码=0;
对于(int k=31;k>=0;k--){
长评估比特=c>>k;
如果(evaluateBit==1){
评价比特=0;
}否则{
评价比特=1;
}

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

编辑:

改变

evaluateBit = (c >> k);


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

对于这个问题的0输入,我应该得到4294967295,而不是-1。@CommittedDroider这是因为赋值特别要求使用无符号整数,但您使用的是有符号整数。是的,但是从中,java没有无符号整数integers@Juhana你们是对的。这是由于数据类型。我将该方法中的所有数据类型都更改为long,因此这不再是问题。但我仍然得到输入2147483647的不正确输出。预期值为2147483648,但我得到的是3221225471。大家看到问题了吗?@committedandroider 4294967295不在int范围内,因此您不能为0输入获取该输出。请有人解释下一票?这明确地遵循了
evaluateBit = (c >> k) & 1;