gpt4 book ai didi

c++ - 为什么这个 int-to-binary 尝试失败超过 16,我该如何清理它?

转载 作者:行者123 更新时间:2023-11-27 23:21:49 25 4
gpt4 key购买 nike

我的一些个人工作需要这个函数,虽然一般来说这样做很简单,但我以前没有真正玩过位移位。我有以下代码,它试图将整数转换为无符号整数 vector ,其中每个整数为 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*sizeof x,因为一个字节有 8 位——尽管有更好的方法(见下文)。

向上清理:

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

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

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

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

  5. 您可以通过使用 std::reverse 轻松避免使用堆栈。在 vector ( #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;
}

关于c++ - 为什么这个 int-to-binary 尝试失败超过 16,我该如何清理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com