比特错误,一个错误

时间:2018-01-10 18:10:16

标签: c++ bit-manipulation

    #include <iostream>
    #include <bitset>
    using namespace std;

    int main(){
        int k = -1;
        int v = -1;
        int r = 0;
        for(int s = 0; s <= 30 ; s++){
            int vbit = v & 1;
            v >>= 1;
            r |= vbit;
            r <<= 1;
        }
        int vbit = v & 1;
        r |= vbit;
        cout << bitset<32>(k) << "  " << bitset<32>(r) << endl;
    }

我编写了一个代码来反转整数中的位。如果我按照编写的方式运行代码,我的代码工作得很好,但我认为我循环的次数少于我应该得到正确的答案。我必须移动31次以访问int中的所有位和for循环后的最后两行代码将最后一位修补到它们的位置。 是存在概念问题还是愚蠢的错误?

2 个答案:

答案 0 :(得分:0)

这是一种适用于任何无符号整数类型的方法。 (无符号,因为它是未定义的行为,左移一个负数,所以使用无符号强制调用者确保该值是非负的)

#include <limits>
#include <type_traits>

template <typename T>
auto reverse_bits(T value) -> T
{
    static_assert(std::is_unsigned<T>::value, "type must be unsigned integer");

    constexpr auto digits = std::numeric_limits<T>::digits;

    T result = 0;
    for (int k = 0; k < digits; ++k)
        result |= ((value >> k) & 0x01) << (digits - (k + 1));
    return result;
}

答案 1 :(得分:0)

在将vbit添加到r之前将移位应用于r。

这样你可以换32次。