如何更改此功能以处理负数?它正确输出所有内容,但在负数时它不会使前导位1。我不能进行否定检查然后只需强制第一位为1,因为前导位和其余数字之间的0将关闭。
char* fromInt(int bin){
static char str[33];
str[1] = '\0';
int n;
for (n = 128; n > 0; n >>= 1){
if( (bin & n) == n){
strcat(str, "1");
}else{
strcat(str, "0");
}
}
return str;
}
答案 0 :(得分:0)
我想你想要的是:
char* fromInt(int bin)
{
static char str[33];
str[0] = '0' + ((bin & 0x80000000) == 0x80000000);
str[1] = '\0';
for (int n = 0x40000000; n > 0; n >>= 1) {
if ((bin & n) == n)
strcat(str, "1");
else
strcat(str, "0");
}
return str;
}
该功能有两个步骤。首先是确定符号位的设置(假设int
对象有32位且它使用二进制补码算法):
(bin & 0x80000000) == 0x80000000
产生1
或0
。因为它是关于标志的,它可能只是简单地写成:
'0' + (bin < 0)
第二步是将剩余的位从第30位循环到0,就像原始代码一样。
以下是一个示例程序:
int main(void)
{
printf("%s\n", fromInt(0));
printf("%s\n", fromInt(1536));
printf("%s\n", fromInt(-1));
return 0;
}
这将输出:
00000000000000000000000000000000
00000000000000000000011000000000
11111111111111111111111111111111