【发布时间】:2017-09-12 15:40:12
【问题描述】:
我想将一个无符号整数转换为一个 48 位二进制表示的数组,如果结果小于 48 位,那么我需要将其余位归零。函数如下:
char *getBinary(unsigned int num)
{
char* bstring;
int i;
bstring = (char*) malloc(sizeof(char) * 49);
assert(bstring != NULL);
bstring[48] = '\0';
for( i = 0; i < 48; i++ )
{
bstring[48 - 1 - i] = (num == ((1 << i) | num)) ? '1' : '0';
}
return bstring;
}
在主函数中:
unsigned int nbr1=3213816984;
char * bi=getBinary(nbr1);
结果应该是:
000000000000000010111111100011101111010010011000
但我得到了:
111101001001100010111111100011101111010010011000
为什么我不能将超过 32 位的位清零?
【问题讨论】:
-
因为
unsigned int num是一个 32 位的数量。在转换之前,您必须转换为 64 位数量,例如unsigned long long。 -
@JonathanLeffler 您好,感谢您的回复!我尝试使用 unsigned long long 但仍然得到相同的结果。
-
您必须更改函数的接口,以便它接受 64 位(或大于 32 位)的值 — 在任何正常情况下,您基本上不会获得超过 32 位的值平台。
1 << i中的1也是int,因此是 32 位的。您可能需要在那里使用1ULL << i。此外,num == ((1ULL << i) | num)可能没有做你想做的事。您可能需要((1ULL << i) & num) != 0或附近。 -
嗨,非常感谢我尝试了 num == ((1ULL
-
嗯...这是一个不寻常的成语(我不记得以前见过),但我猜
num == ((1ULL << i) | num)确实有效。它检查num在您设置数字中的第 i 位时不会改变。num & (1ULL << i)表示法从数字中提取第 i 位——因此我编写了替代测试。
标签: c arrays binary bit-manipulation decimal