c++ - 反向位算法

标签 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。为什么会这样?我一直试图用我的逻辑找出问题,但到目前为止一直没有成功。我已经在网上看到了执行此操作的各种方法,但仍然想知道我做错了什么。

提前致谢!

最佳答案

需要调换两个操作的顺序:

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

要理解原因,请盯着现有代码并自命不凡地说它最终会产生一个 output,其最后一位将始终为 0。因为最后要做的事情是output,不管你的int有多大,总是左移操作。这将始终将 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++){

关于c++ - 反向位算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364387/

相关文章:

c++ - 了解方法重载规则

c - C中字符数组的位操作

cryptography - 为什么 XOR 是组合哈希值的默认方式?

c - 无限循环中的反转整数

c++ - 显示实现最大利润的步骤

c++ - 模板方法在哪里实例化?

c# - 我如何从 int 中得到一点?

java - 反转字符串变量

javascript - 如何使用javascript逐字反转字符串中的单词?

c++ - nm 命令输出中的 '@@' 符号是什么意思?