2016-09-23 156 views
0

我创建了一个方法来生成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; 
} 

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

+0

Errr,号码是号码,数字表示是数字表示?我更喜欢基地20顺便说一句,有十个手指和十个脚趾。 –

+0

@ ClaytonTM9你似乎有一个主要的低音。 –

+1

@ ClaytonTM9 - 1)'int len = binary.size(); int a = binary [len];'这是无效的C++。数组必须使用常量作为条目数来声明。 2)'pow(2,len-i-1)' - 如果[exponent是一个整数],不要使用'pow'(http://stackoverflow.com/questions/25678481/why-does-pown- 2-return-24-when-n-5 -with-my-compiler-and-os) – PaulMcKenzie

回答

0

的代码是不是所有的坏,但它确实有一些问题:

  • 如果只想非负值的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<<(len-i-1));

+0

非常感谢,关于你指出的第一个项目符号的问题。我需要使用什么来保持大于32的值,而不会导致负值? – ClaytonTM9

+0

31位数为0到2,147,483,647。最常见的无符号整数类型是'unsigned long long',在我知道的所有平台上都有64位,所以这给你0到18,446,744,073,709,551,615。为了获得更多的信息,你可能需要使用一个数组或者向量值,并为它创建自己的数学函数。 'std :: bitset'是标准库中的一种数据类型,它将保存任意数量的位,并受到平台功能的限制。 –

相关问题