反向比特算法

时间:2016-07-14 02:06:02

标签: c++ bit-manipulation reverse

这是一个非常明显和简单的问题,我很遗憾地遇到了一些问题。反转给定整数中的位(不反转/翻转位)使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.为什么会发生这种情况?我一直试图用我的逻辑来解决这个问题,但到目前为止还没有成功。我已经看到了在线进行此操作的各种方法,但仍想知道我做错了什么。

提前谢谢!

1 个答案:

答案 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