反向位算法

Reverse Bits Algorithm

本文关键字:算法      更新时间:2023-10-16

这是一个非常明显和简单的问题,不幸的是我遇到了一些麻烦。反转给定整数中的位(不反转/翻转位),使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。为什么会这样?我一直试图用我的逻辑找出问题,但到目前为止没有成功。我已经在网上看到了各种方法,但仍然想知道我做错了什么。

提前谢谢你!

您需要切换两个操作的顺序:

    output <<= 1;
    output |= input&1;

要理解原因,请盯着现有的代码,并说明它最终会生成一个output,其最后一位将始终为 0。因为无论您int有多大,对output做的最后一件事总是左移操作。这总是output的最后一个位是0。这显然是错误的。

此外,由于int中有 sizeof(int)*8 位,循环显然必须迭代 sizeof(int)*8 次,以处理 # 位,但是:

for(int i=0; i<((sizeof(int)*8)-1); i++){

这迭代了sizeof(int)*8-1次。比所需数量少一个。这应该是:

for(int i=0; i<sizeof(int)*8; i++){