【问题标题】:Int to Binary Conversion explanationInt 到二进制转换说明
【发布时间】:2014-04-19 17:34:55
【问题描述】:

我的问题是基于这篇文章: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(或任何其他大小)位转换吗?

【问题讨论】:

    标签: c binary decimal bit-manipulation


    【解决方案1】:

    我英语不好,抱歉。 你也需要调整局部变量'mask'。

    #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;
    }
    

    我想解释一下为什么这段代码运行良好。 但... 我英文不是很好... 我只是希望它会有所帮助/

    【讨论】:

      【解决方案2】:
      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 个字符的数组。此外,您需要更改掩码,以便它可以屏蔽所有位。

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

      【讨论】:

      • 感谢您对屏蔽问题的透彻解释。我尝试了几次搜索第一个值的掩码,但没有找到任何有用的结果。
      【解决方案3】:

      接受回答后。

      幻数太多。

      在原文中,有常量50x1065 二进制数字的目标没有关系。

      然后当转到 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;
      }
      

      注意:当BitWidth 匹配int 宽度时,上述方法(和其他答案)会出现问题。但这是另一个可以通过使用unsigned 数学轻松解决的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多