当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?
Posted
技术标签:
【中文标题】当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?【英文标题】:Why do bits repeat when I convert a base-10 number into a base-2 number?当我将基数为 10 的数字转换为基数为 2 的数字时,为什么位会重复? 【发布时间】:2021-10-15 11:07:08 【问题描述】:我有一个简单的问题。我编写了这个小函数,它应该得到一个无符号的 base-10 数字,然后以 64 位的二进制表示形式打印它。我注意到我的代码生成的一个特殊细节,尽管看起来我没有做错任何事情。似乎这些位重复自己!我尝试打印一个以 10 为底的“1”,这个数字是正确的,但是当它到达第 32 位时,我注意到数字重复了!例如:如果我想我的程序在64位二进制表示打印1,那么我应该得到0000000000000000000000000000000000000000000000000000000000000001.相反,我得到0000000000000000000000000000000100000000000000000000000000000001.这是每一个我都试过数是相同的,我不知道这是为什么正在发生。哦,亲爱的 Stack Overflow 程序员,这是怎么回事!我可以使用你的大脑和知识非常感谢你。即使您将我指向在线文章,我们也将不胜感激。
#include <stdio.h>
void decToBinary(int base_10_number);
int main(void)
decToBinary(1);
return 0;
/* decToBinary: converts a base 10 number into a base 2 number and prints the result */
void decToBinary(int base_10_number)
unsigned short bitmap[64];
for (int index = 0, pos = 63; index < 64; index++, pos--)
bitmap[pos] = 1 << index & base_10_number;
for (int control = 0; control < 64; control++)
printf("%i", bitmap[control]);
putchar('\n');
【问题讨论】:
int base_10_number
你知道那是多少位吗?然后考虑在第一个for
循环中假设了多少位。尝试检查 32 位数字的 64 位是没有意义的。
【参考方案1】:
1 << something
仅适用于 0 到 30 或 31 中的 something
。即 32 位 int
数学。
// vv----- too big
for (int index = 0, ...; index < 64; index++, ...)
bitmap[pos] = 1 << index & base_10_number;
除此之外,它是未定义的行为。
也许移位只查看了something
的 5 个最低有效位。
试试
for (int index = 0; index < 32; index++)
bitmap[32 - 1 - index] = ((1u << index) & base_10_number) != 0;
for (int control = 0; control < 32; control++)
printf("%i", bitmap[control]);
【讨论】:
感谢您的时间和回答,我一定会研究这个限制,因为我完全不知道它存在于 C 中! @HerrWeishaupt 对于 64 位整数,请研究unsigned long long
而不是使用 int
。以上是关于当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?的主要内容,如果未能解决你的问题,请参考以下文章