我需要这个函数来完成一些个人工作,尽管通常这样做很琐碎,但我以前从未真正尝试过比特移位。我有下面的代码,它试图将一个整数转换为无符号整数的向量,其中每个都是1或0(表示位)。我可以假设整数总是大于或等于0。这是我的代码:
vector<unsigned int> toBinary(int x)
{
stack<unsigned int> s;
vector<unsigned int> ret_val;
for (unsigned i = 0; i < sizeof(x); ++i)
{
int z = ((x >> i) & 1) ? 1 : 0;
s.push(z);
}
unsigned num_bits = s.size();
for (unsigned i = 0; i < num_bits; ++i)
{
ret_val.push_back(s.top());
s.pop();
}
return ret_val;
}
对于16以下的整数,这是可以正常工作的,但它会失败。我使用堆栈来反转位的顺序,因此最高有效位在最终返回值的左边。为什么这个坏了,我该怎么清理?感谢
x是一个int,大概是32位,即4个字节。sizeof x=4,4位允许数字0..15
您想要的是8*sizeofx,因为一个字节中有8个比特——尽管有更好的方法(见下文)。
清理方式:
-
避免使用
using namespace std
,如果必须使用,则将其缩小为一次性使用(例如using std::vector
)。这意味着用std::
来装饰事物,但为了可读性,这是值得的。 -
使用
unsigned int
而不是int
,明确您正在使用的内容。 -
返回
bool
的向量似乎更有意义。 -
无符号int中的位数由
std::numeric_limits<unsigned int>::digits
(#include <limits>
)给出。 -
通过在向量(
#include <algorithm>
)上使用std::reverse
,可以很容易地避免使用堆栈。
把所有这些放在一起,你的功能可能看起来像:
std::vector<bool> toBinary(unsigned int x)
{
std::vector<bool> ret_val;
for ( unsigned int z = x; z > 0; z /= 2 ) {
bool r = ( ( z & 1 ) == 1 );
ret_val.push_back(r);
}
int bits = std::numeric_limits<unsigned int>::digits;
ret_val.resize(bits);
std::reverse( ret_val.begin(), ret_val.end() );
return ret_val;
}