int到bitstring函数来处理负数

时间:2017-02-03 00:38:03

标签: c binary

如何更改此功能以处理负数?它正确输出所有内容,但在负数时它不会使前导位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;
}

1 个答案:

答案 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

产生10。因为它是关于标志的,它可能只是简单地写成:

'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