#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循环后的最后两行代码将最后一位修补到它们的位置。 是存在概念问题还是愚蠢的错误?
答案 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次。