各位! 现在我被一个问题卡住了......
问题:给定一个二进制数为数组,写一个函数,把数组和它的大小作为参数,并返回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;
}
你可以用这个算法来做。
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
我的代码可以找到一个漂亮的表示方法 此处.
希望能帮到你
你正在执行比必要的更多的操作。
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和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开始,你必须从数组的最后一个开始。