【问题标题】:converting number characters in a char array to binary将 char 数组中的数字字符转换为二进制
【发布时间】:2014-05-24 22:35:56
【问题描述】:
char *toBin(unsigned long long num)
{
  char s[9999];
  const int size= 9999;
  char *temp = new char[size];
  int i, j;
  int binBase = 2;

  for(i=0; num!= 0; i++)
  {
      s[i] = num % binBase + '0';
      num /= binBase;
  }//get backwards binary

  for(j=0; i>=0; j++)
  {
      i--;
      temp[j]=s[i];
  }//reverse binary sequence

  //increments one more so need to decrement
  temp[--j] = '\0';
  return temp;
  delete temp;
}

如果我在 char 数组中有“82”,我首先将“82”转换为十进制 82,然后将 82 给上面的函数以转换为二进制。这仅在一定的数字限制内有效。

我认为我的问题是 unsigned long long 只能保存一定数量的数字,所以当它超过这个限制时,一些随机的东西会发送到函数,它会打印出错误的二进制文件。

上述函数将 unsigned long long num 转换为二进制。我意识到更好的方法是查看 char 数组中的每个字符,而不是先将其转换为数字,然后使用这些值转换为二进制。然而,我很难把它写成代码。任何建议或帮助将不胜感激。

【问题讨论】:

  • 与如何获取以二进制形式打印的数字并没有真正的关系,但是您在此函数中分配了很多不需要的内存。您最多需要 sizeof(unsigned long long)*8+1 个字符(空终止符为 +1)。另外,删除温度;永远不会被调用,因为到达返回时函数结束。

标签: c++ binary char


【解决方案1】:
  • 在堆栈上分配 9999 char 的数组是不明智的,因为它可能对您的平台来说太大了。无论如何,您可以轻松计算所需的最大位数(+终止符):CHAR_BIT*sizeof num+1。
  • 此外,无需在堆上分配相等的数量。
  • 不要害怕指针:
    • 初始化指向最后一个字节的指针
    • 将其设置为零
    • 从最小的数字开始添加所有数字(至少一个,即使数字为 0)。
    • 返回完成号码的副本。

【讨论】:

    【解决方案2】:

    GNU 多精度 (GMP) 库具有以任何基数打印任何大小数字的功能。下面是一个例子。

    #include <iostream>
    #include <gmpxx>
    
    int main()
    {
        std::string numstr = "1234123412341234123412341234";
    
        // initialize mpz_class to have numstr in it (given in base 10)
        mpz_class bigint(numstr, 10);
    
        // convert to binary (base 2)
        std::string binstr = bigint.get_str(2);
    
        std::cout << numstr << " -> " << binstr << std::endl;
        return 0;
    }
    

    程序的输出

    1234123412341234123412341234 -> 111111110011010111110011000011110100100000101001110100011000000101000011000000000111110010
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2014-05-27
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多