【问题标题】:Converting a binary vector into a decimal array将二进制向量转换为十进制数组
【发布时间】:2017-01-31 18:56:31
【问题描述】:

我创建了一种方法来生成具有 n 位最多 256 位的随机二进制数。为了继续我的程序,我需要将向量与我的二进制值一起放入十进制数组中,然后将该数字转换为 int 十进制。这是创建随机二进制向量的以下函数以及我尝试转换为十进制的函数。我在将二进制向量转换为十进制时遇到问题。

int random_binary(int n, int m){

   vector<int> binary;

   for(int i = 0; i < n; i++)
   {
      m = rand() % 2;

      binary.push_back(m);
   }

   binary.push_back(1);

   int j;

   for(j = 0; j < binary.size(); j++)
   {
       cout << binary[j];
   }
   cout <<"\n";


   int len = binary.size();
   int a = binary[len];   //having trouble right here

   int decimalValue = 0;

   for (int i = len-1; i>= 0; i--)
   {
       decimalValue = decimalValue + binary[i]*pow(2,len-i-1);
   }

   return decimalValue;
}

如果有人能帮助解决这个问题,将不胜感激。

【问题讨论】:

  • Errr,数字是数字,数字表示是数字表示?我更喜欢以 20 为底的 BTW,有十个手指和十个脚趾。
  • @ClaytonTM9 看来你有一个严重的缺陷。
  • @ClaytonTM9 -- 1) int len = binary.size(); int a = binary[len]; 这不是有效的 C++。数组必须使用常量作为条目数来声明。 2) pow(2,len-i-1) -- 如果exponent will be an integer@,则不要使用pow

标签: c++ arrays vector binary decimal


【解决方案1】:

代码并没有那么糟糕,但确实存在一些问题:

  • int 值在大多数平台上只能保存 32 位,如果您只想要非负值,则可以保存 31 位。所以对于 256 位二进制数字,你需要使用别的东西。

  • int a = binary[len]; //having trouble right here - 我认为@PaulMcKenzie 将此解释为尝试声明具有可变数量元素的 int 数组 (int a[len];)。我认为它可能将int 变量初始化为binary 中最后一个条目之后的元素。无论哪种方式都是错误的——但无论如何你永远不会使用a,而且我看不出它有任何可能的用途。因此,只需删除该行。

  • 不是错误,但你应该明白int decimalValue 不是十进制,它是一个整数,它很可能作为一组位存储在计算机内部,并且仅在以下情况下显示为十进制数转换并以某种方式显示,例如使用std::cout 打印时。

  • 在求和循环中,std::pow 不应用于整数值,但幸运的是,位左移运算符可用于获得 2 的整数幂:
    decimalValue = decimalValue + binary[i] * (1&lt;&lt;(len-i-1));

【讨论】:

  • 非常感谢,关于您指出的第一个项目符号的问题。我需要使用什么来保持大于 32 的值而不使其变为负值?
  • 嗯 31 位给你数字 0 到 2,147,483,647。最常见的无符号整数类型是unsigned long long,在我知道的所有平台上都有 64 位,所以这给了你 0 到 18,446,744,073,709,551,615。对于更多位,您可能需要使用数组或值向量,并为其创建自己的数学函数。 std::bitset 是标准库中的一种数据类型,它将包含您想要的任意数量的位,受平台功能的限制。
猜你喜欢
  • 2011-08-10
  • 2016-12-25
  • 2010-12-08
  • 2018-07-17
  • 2012-06-26
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多