【问题标题】:C++ Array of binary numbers to int valueC++ 二进制数数组到 int 值
【发布时间】:2020-08-29 16:59:21
【问题描述】:

大家!现在我被困在这里有一个问题......

问题:

给定一个表示为数组的二进制数,编写一个函数 将数组及其大小作为参数,并返回整数 价值。您可以假设至少有 1 个且不超过 30 个 数组中的数字,并且所有值都是 0 或 1。 数组在开始时以最高有效二进制数字排序 (索引 0)和末尾的最低有效位。

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

我写的函数在底部。 返回 number_of_digits 的 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;
}

【问题讨论】:

  • "返回 number_of_digits
  • 你的函数很奇怪。它接受[1001] 之类的数组,然后将其转换为字符串"1001",并将其转换为int,即1001。答案似乎应该是9
  • 可能是return static_cast&lt;int&gt;(std::bitset&lt;30&gt;(bin_str).to_ulong());?当然,这假设 bin_str 是正确创建的。
  • 您对分配有两种误解。首先它说最高位首先出现,但你把它放在最后,然后你应该转换为十进制。您的函数返回 1 输入 {1,0} 但它应该是 2
  • 问题是,一旦你按照作业的要求去做,数字位数的问题可能就会消失。现在你受到int的数字限制,但你真的不需要达到这个限制

标签: c++ arrays string binary decimal


【解决方案1】:

你可以使用这个算法来做到这一点:

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 找到我的代码的漂亮表示。

希望对你有帮助。

【讨论】:

  • 我不明白。为什么不使用左移位运算符&lt;&lt;?;
  • @ThomasMatthews 我还不知道使用位运算符。
【解决方案2】:

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

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

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

手动尝试算法。

【讨论】:

    【解决方案3】:

    首先你在你的字符串中使用 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 开始,您必须根据您的问题从数组的最后一个开始

    【讨论】:

    • 不要使用pow。它是一个浮点函数,可能会产生不精确的结果。
    • 然后使用位操作,但二的幂切到 int 没问题
    • int x = pow(2,1) 只会是 2 而不是 2.000 或 0
    • 其他方式可以是位设置,但我认为你需要功能而不是位设置的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2018-12-05
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多