【问题标题】:Converting decimal to binary using exponents使用指数将十进制转换为二进制
【发布时间】:2019-12-14 13:30:23
【问题描述】:

我被要求编写将十进制转换为二进制形式的代码。我尝试了几种不同的方法,但没有给我需要的顺序。所以我目前坚持如何进行。

我尝试通过正常查找二进制比较,但它给我的顺序不正确,假设正确的顺序是 1001100,我只得到 0011001。我无法更改顺序。我不允许使用除 iostream、cmath 和 string 之外的任何其他库。我现在试图简单地使用指数 2^exponent 找到转换。

这是我目前拥有的:

int num, exp,rem;

string biNum;

cout<<"Enter decimal number: "<<endl;
cin>>num;

for (exp = 0; pow(2, exp) < num; exp++) {
}

while (num > 0) {
    rem = num % (int) pow(2, exp);
    if (rem != 0) {
            biNum = biNum + '1';
    } else {
            biNum = biNum + '0';
    }
    exp--;
    }
cout<<biNum;
return 0;

}

我目前没有收到任何结果。

【问题讨论】:

  • 不要使用pow(2, X),因为它有很多开销。改用左移:(1 &lt;&lt; X)。许多处理器可以在一条或两条指令中实现左移。
  • 您可能希望使用按位与来测试位位置而不是余数运算符'%'。同样,AND 操作通常是 1 条或更多条指令(用于向寄存器加载值)。
  • 该任务的预期解决方案将不使用pow(),这是一种昂贵的浮点计算,没有用于执行简单整数计算的业务,可以使用位移原语轻松执行。更不用说floating point math is broken。我几乎可以向你保证,无论是谁要求你写这篇文章,都会拒绝这种解决方案。您的 C++ 书籍将提供有关 C++ 中可能的各种位移操作的更多信息。
  • 和这些问题一样,这里唯一的十进制到二进制转换是cin &gt;&gt; num;。从那里开始,数字是二进制的,这可以通过常数 10 的除法和余数运算得到证实。您真正要做的是从二进制转换为分区二进制。

标签: c++ binary decimal exponent


【解决方案1】:

以下是收集最低有效位 (LSB) 中的位的示例:

//...
while (num > 0)
{
  const char bit = '0' + (num & 1);
  biNum += bit;
  num = num >> 1;
}

说明

循环一直持续到num 变量为零。除非你真的想要它们,否则添加额外的零是没有意义的。

(num &amp; 1) 表达式在位为 1 时返回 1,或在位为 0 时返回 0。
然后将其添加到字符0 以产生'0''1'

变量被声明为const,因为它在声明(定义)之后不会被修改。

新创建的字符被附加到位串。

最后,num 右移一位(因为该位已被处理)。

还有许多其他方法可以按最高有效位 (MSB) 顺序收集位。这些方法留给 OP 和读者。 :-)

【讨论】:

    【解决方案2】:

    给你。这会以正确的顺序输出位:

    #include <iostream>
    #include <string>
    
    int main ()
    {
        unsigned num;
        std::string biNum;
        std::cin >> num;
    
        while (num)
        {
            char bit = (num & 1) + '0';
            biNum.insert (biNum.cbegin (), bit);
            num >>= 1;
        }
    
        std::cout << biNum;
        return 0;
    }
    

    Live demo

    【讨论】:

      【解决方案3】:

      您可以使用递归函数以相反的顺序打印结果,避免使用容器/数组,如下所示:

      void to_binary(int num) {    
          int rem = num % 2;
          num = (num - rem) / 2;    
          if (num < 2){ 
              std::cout << rem << num;
              return;
          }    
          to_binary(num); 
          std::cout << rem;
      }
      
      int main()
      {
          to_binary(100);
      }
      

      【讨论】:

      • 这里不是有点没必要吗?当使用迭代可以轻松编写递归时,我们不应该使用递归。
      猜你喜欢
      • 2010-12-08
      • 2012-06-26
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2015-01-28
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多