为什么这个int到binary的尝试在超过16时失败,以及我如何清理它

Why does this int-to-binary attempt fail past 16, and how can I clean it up?

本文关键字:失败 16时 何清理 int binary 为什么      更新时间:2023-10-16

我需要这个函数来完成一些个人工作,尽管通常这样做很琐碎,但我以前从未真正尝试过比特移位。我有下面的代码,它试图将一个整数转换为无符号整数的向量,其中每个都是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个比特——尽管有更好的方法(见下文)。

清理方式:

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

  2. 使用unsigned int而不是int,明确您正在使用的内容。

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

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

  5. 通过在向量(#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;
}