0

我需要这个函数来完成一些个人工作,虽然这样做通常是微不足道的,但我之前并没有真正玩过移位。我有以下代码,它试图将整数转换为无符号整数的向量,其中每个是 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 的整数,然后失败。我使用堆栈来反转位的顺序,因此最重要的位在最终返回值的左侧。为什么这个坏了,我该如何清理它?谢谢

4

1 回答 1

4

x 是一个 int - 大小大概是 32 位,4 个字节。sizeof x = 4,4 位允许数字 0..15

你想要的是 8*sizeof x,因为一个字节中有 8 位 - 尽管有更好的方法(见下文)。

向上清理:

  1. 避免using namespace std,如果您必须使用它,则将其缩小到一次性使用(例如 using std::vector)。这意味着用 来装饰东西std::,但为了可读性,这是值得的。

  2. 使用unsigned int而不是int,明确说明您正在使用什么。

  3. 返回一个向量bool似乎更有意义。

  4. 无符号整数中的位数由std::numeric_limits<unsigned int>::digits( #include <limits>) 给出。

  5. 您可以通过std::reverse在向量 ( #include <algorithm>) 上使用来轻松避免使用堆栈。

把它们放在一起,你的函数可能看起来像:

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;
}
于 2012-09-06T17:19:21.003 回答