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

问题描述 投票:0回答:1

各位! 现在我被一个问题卡住了......

问题:给定一个二进制数为数组,写一个函数,把数组和它的大小作为参数,并返回integervalue。

给定一个用数组表示的二进制数,写一个函数 以数组和它的大小作为参数,并返回整数值。你可以假设数组中至少有1个且不超过30个数字,所有的值不是0就是1。数组的顺序是最有意义的二进制数位在开始(索引0),最没有意义的数位在结束。

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

我写的函数在最下面,它可以很好地返回int值,用于 数位数<=10。.

正如你所看到的,该问题说:"你可以假设,有至少1和不超过30个数字的阵列"

我的问题是,我怎样才能修正我的函数,使其返回正确的int值,即使有超过10个数字(可能是30个数字)?

或者,我应该用不同的方法来解决这个问题吗? 如果是,我应该怎么做?

#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;
}
c++ arrays string binary decimal
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

我的代码可以找到一个漂亮的表示方法 此处.

希望能帮到你


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

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

用手试一试这个算法。


0
投票

首先,你的字符串中使用了0和1,所以假设你的数组是30个长度,那么字符串也将是30个长度,但是long long even的最大大小是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开始,你必须从数组的最后一个开始。

© www.soinside.com 2019 - 2024. All rights reserved.