Int到二进制转换的解释

时间:2014-04-19 17:34:56

标签: c binary decimal bit-manipulation

我的问题基于这篇文章:Decimal to Binary及其选择的解决方案。

我可以让所选择的答案代码正常工作,但它只适用于5位。如何修改此代码以适用于更大的数字,比如8位?

我尝试将第一行中的字符偏移量从5调整为8,但没有成功。

void getBin(int num, char *str)
{
  *(str+5) = '\0';
  int mask = 0x10 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}

并使用给定代码进行测试,再次调整6到9以匹配上述函数:

int main()
{
  char str[6];
  getBin(10, str);
  printf("%s\n", str);
  return 0;
}

但输出仍然只显示前五位然后给出随机符号。当我调整这些数字时,有人可以解释一下究竟发生了什么,这样我就可以将其用于8(或任何其他大小)的位转换吗?

3 个答案:

答案 0 :(得分:1)

我不擅长英语,抱歉。 你需要调整局部变量&#39; mask&#39;太

#include <stdio.h>

void getBin(int num, char *str)
{
  *(str+8) = '\0';
  int mask = 0x80 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}

int main()
{
  char str[9];
  getBin(10, str);
  printf("%s\n", str);
  return 0;
}

我想解释为什么这段代码运行良好。 但... 我不擅长英语...... 我希望它有用/

答案 1 :(得分:0)

void getBin(int num, char *str)
{
  *(str+8) = '\0';
  int mask = 0x80 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}

main()
{
  char str[9];
  getBin(254, str);
  printf("%s\n", str);
  return 0;
}

对于8位数字,您需要9个字符的数组。您还需要更改掩码,因此它可以掩盖所有位。

11111这样的5位数的最高有效位的掩码是10000,它等于16十进制或10十六进制。 对于8位数字也是如此。掩码是10000000。由于循环以mask >>= 1开始,因此掩码会向左移动int mask = 0x10 << 1;以进行补偿。 因此,要为x-bit数字修改它,请定义x+1个字符数组。将\0放在索引x。查找x-bit个数字,其中最重要的位为1,其他位数为0。数字为2^(x-1)(2次幂(x-1))。

答案 2 :(得分:0)

接受回答后。

太多魔术数字。

在原文中,常量50x106没有显示与5二进制数字编号的目标的关系。

然后,当转到8时,使用常量80x109。由于未调整0x10,因此代码失败。

而是通过更一般的观点来解决问题,并使用消除或更好地表达这些幻数的代码。

#define BitWidth 5

void getBin(int num, char *str)
{
  int mask = 1 << (BitWidth - 1);
  // skip the original shift left and then immediately shift right
  do {
    *str++ = !!(mask & num) + '0';
  } while (mask >>= 1);
  *str = '\0';  // by appending at the end, no need for a magic number
}  

int main()
{
  char str[BitWidth + 1];
  getBin(10, str);
  printf("%s\n", str);
  return 0;
}

注意:当BitWidthint宽度匹配时,上述方法(和其他答案)存在问题。但这是使用unsigned数学轻松解决的另一个问题。