C ++二进制数字数组转换为int值

时间:2020-05-13 13:17:13

标签: c++ arrays string binary decimal

大家!现在我在这里遇到了问题...

问题:

给出一个表示为数组的二进制数,编写一个函数 将数组及其大小作为参数,并返回整数 值。您可以假设至少有1个且不超过30个 数组中的数字,并且所有值均为0或1。 数组的开头是最高有效二进制数字 (索引0),最后一位最低有效数字。

Signature: int binary_to_number(int binary_digits[], int number_of_digits)

我写的函数在底部。 返回 数字位数<= 10 的int值效果很好。

如您所见,这个问题说:“您可以假设数组中至少有1个且不超过30个数字”

我的问题是,即使有10个以上的数字(也许是30个数字),如何修复函数以返回正确的int值?

或者,我应该以不同的方式来解决问题吗?如果是这样,我该怎么办?

#include<iostream>
#include<string>

int binary_to_number(int binary_digits[], int number_of_digits){
    std::string bin_str;

    for (int i=0; i<number_of_digits; i++) {
         if (binary_digits[i] == 0) {
             bin_str = "0" + bin_str;
         } else if (binary_digits[i] == 1) {
             bin_str = "1" + bin_str;
           } 
    }
    int bin_int = std::stoi (bin_str);
return bin_int;
}

3 个答案:

答案 0 :(得分:0)

首先,u在字符串中使用0和1,因此假设您的数组长度为30,则字符串也将为30,但是 long long的最大大小为18位,甚至会溢出

int bin_int = std::stoi (bin_str);

上面是完全错误的...

您必须以2的幂数将二进制数转换为整数,然后如果您想将其转换为int没问题,但是我建议您这样做,否则您的方法会很杂乱

num += pow(2,i); // watch out for overflows if u experience such; then 
                 // better use bit manipulation for 2's power eg.(1<<i)

这里只是旧方法没问题.....但这是从LSB开始的。在MSB中,您必须根据问题从数组的最后一个开始

答案 1 :(得分:0)

您可以使用此算法来这样做:

int conversion(int array[], int len) {
    int output = 0;
    int power = 1;

    for (int i = 0; i < len; i++)
    {
        output += array[(len - 1) - i] * power;
        // output goes 1*2^0 + 0*2^1 + 0*2^2 + ...
        power *= 2;
    }

    return output;
}

可以将示例语句视为:

int arr[16] = {1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1};
std::cout << conversion(arr, 16);

然后应该退出:

39321

可以找到我的代码的漂亮代表here

希望有帮助。

答案 2 :(得分:0)

您执行的操作超出了必要。

int result = 0;
int index = number_of_digits - 1;
for (int i = 0U; i < number_of_digits; ++i)
{
  result = (result << 1) | binary_digits[index];
  --index;
}

结果初始化为零。
对于数组中的每一位:
将结果左移一位,为新位腾出空间。
算术或新位。

手动尝试算法。