我试图将整数转换为等效的二进制表示。
我使用以下算法
void decimal_to_binary(uint32_t number)
{
char bitset[32];
for(uint32_t i=0; i<32; ++i)
{
if((number & (1 << i)) != 0)
{
bitset[31-i] = '1';
}
else
{
bitset[31-i] = '0';
}
}
for(uint32_t i=0; i<32; ++i)
{
cout << bitset[i];
}
cout << "\n";
}
当我执行此功能时,例如&#39; 5&#39;声明为uint32_t我得到了正确的结果
decimal_to_binary(5)
00000000000000000000000000000101
但是当我将数字声明为uint64_t并且还将bitset的大小更改为64位时,结果会大不相同
添加代码以执行相同的操作
void decimal_to_binary(uint64_t number)
{
char bitset[64];
for(uint64_t i=0; i<64; ++i)
{
if((number & (1 << i)) != 0)
{
bitset[63-i] = '1';
}
else
{
bitset[63-i] = '0';
}
}
for(uint64_t i=0; i<64; ++i)
{
cout << bitset[i];
}
cout << "\n";
}
decimal_to_binary(5)
0000000000000000000000000000010100000000000000000000000000000101
我看到的结果与我在uint32中获得的结果相同,但是将其放在另一个旁边。
这让我想知道如何在CPP这样的编程语言中实现uint64_t?
我试着通过查看stdint头文件来获取更多详细信息,但是那里的链接对我帮助很大。
提前感谢您的时间!!
答案 0 :(得分:3)
64位代码中的(1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&n
所以1完全被移出。 我不明白这是如何产生你提供的输出的:)
使用1ull作为常量(无符号长long)
答案 1 :(得分:2)
问题出在这一行:
if((number & (1 << i)) != 0)
<<
运算符的返回类型是左操作数的类型,在您的实现中显然假定为32位长。将类型移动到比其总位数更多会产生未定义的行为。
要修复它,请使用
if((number & (static_cast<uint64_t>(1) << i)) != 0)
答案 2 :(得分:2)
如果只有32位数,则移位1
超过32位是未定义的行为。未定义的行为意味着它可以做任何事情。正如雷蒙德·陈所说,它可能将右侧操作数限制为31(通过按位和32位)。这就是为什么你得到64位值的下半部分的两个副本。尝试将number
向右移动,而不是向左移动1
:
void decimal_to_binary(uint64_t number)
{
char bitset[64];
for(size_t i=0; i<64; ++i)
{
if(number & 1) != 0)
{
bitset[63-i] = '1';
}
else
{
bitset[63-i] = '0';
}
number >>= 1;
}
for(size_t i=0; i<64; ++i)
{
cout << bitset[i];
}
cout << "\n";
}