这是一个非常明显和简单的问题,我很遗憾地遇到了一些问题。反转给定整数中的位(不反转/翻转位)使MSB为LSB,MSB-1为LSB + 1,依此类推。在我看来,我想这样做的方法是将输入的最后一位存储到输出变量中,每次将该变量右移1,然后将输入左移1并重复该过程。这是我到目前为止所写的功能:
unsigned int oldRev(unsigned int input){
unsigned int output = 0;
for(int i=0; i<((sizeof(int)*8)-1); i++){
output |= input&1;
output <<= 1;
input >>= 1;
}
return output;
}
当我尝试执行oldRev(2147483648)时出现问题,其中输入中只有最高有效位为1。输出应该只有1但我得到0.为什么会发生这种情况?我一直试图用我的逻辑来解决这个问题,但到目前为止还没有成功。我已经看到了在线进行此操作的各种方法,但仍想知道我做错了什么。
提前谢谢!
答案 0 :(得分:3)
您需要切换两个操作的顺序:
output <<= 1;
output |= input&1;
要理解为什么,请盯着现有的代码,并总结一下这样一个事实,即它总是会产生一个output
,其最后一位总是为0.因为{{1}将会做的最后一件事总是,无论你的output
有多大,都是左移操作。哪一个总是将int
的最后一位保留为0.这显然是错误的。
此外,由于output
中有sizeof(int)*8
位,因此循环必须显着迭代int
次,以处理该位数,但是:
sizeof(int)*8
这会迭代for(int i=0; i<((sizeof(int)*8)-1); i++){
次。比所需数量少一个。这应该是:
sizeof(int)*8-1