大家!现在我在这里遇到了问题...
问题:
给出一个表示为数组的二进制数,编写一个函数 将数组及其大小作为参数,并返回整数 值。您可以假设至少有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;
}
答案 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;
}
结果初始化为零。
对于数组中的每一位:
将结果左移一位,为新位腾出空间。
算术或新位。
手动尝试算法。