为什么这个int到binary的尝试在超过16时失败,以及我如何清理它
Why does this int-to-binary attempt fail past 16, and how can I clean it up?
我需要这个函数来完成一些个人工作,尽管通常这样做很琐碎,但我以前从未真正尝试过比特移位。我有下面的代码,它试图将一个整数转换为无符号整数的向量,其中每个都是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;
}
相关文章:
- 在Ubuntu 16.04上安装Cilk时出现问题
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 如何让LLDB在成功时退出,在失败时等待
- 生成MRPT库时cmake配置失败
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 当给定默认值时,为什么此模板参数推导失败
- 为什么在使用typedef时类推导指南会失败
- 当需要超过16GB的连续内存时,内存分配失败
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 在 python 模块中导入子模块时PyImport_Import失败
- 当 std::字符串大小 >= 16 时内存泄漏
- 为什么这个int到binary的尝试在超过16时失败,以及我如何清理它
- C++将 char 复制到 char 数组(调试断言失败)时,字符串不是以 null 结尾的
- ADO 创建参数在尝试从 C++ 写入 Oracle 的 RAW(16) 字段时失败并出现0x800A0D5D
- 结果集 ->getString() 在值为 >=16 时崩溃