【问题标题】:Decimal to binary conversion without arrays etc.?没有数组等的十进制到二进制转换?
【发布时间】:2021-01-17 13:56:21
【问题描述】:

我的任务是将十进制数转换为二进制,但由于我们是编程初学者,因此我不允许使用数组、函数等。仅用于 if 和基本操作。

我的代码是:

#include <iostream>
int main()
{
   int n;
   int b;
   
   std::cin >> n;
   
   for (int i=n; n>0; --i) {
       
     b = n%2;
     std::cout << b;
     n = n/2;
   
   }

   return 0;
}

它有效,但它以错误的顺序给了我二进制数,例如它是 0001 代表 4 而不是 1000。有人可以帮帮我吗?

【问题讨论】:

  • 了解您的循环的作用。考虑学习如何使用调试器来探索为什么会偏离您的预期。这是一个非常方便的工具!您的循环基本上打印出正确的二进制表示,但顺序相反。如果没有数组(可以反向打印),你怎么能解决这个问题?我会让你考虑一段时间......
  • 假设 int 是 32 位(仍然是一个合理的假设)开始打印数字的第 32 位。然后是第 31 位。依此类推,一直到第 1 位。使用移位和掩码来获取位。
  • 我不知道你想说什么。也许我可以将循环更改为 i=1;我
  • 我的问题是我的输出不应该输出前导零...
  • 我已将您的问题恢复为其他人已回答的问题。通过更改问题使现有答案无效是不礼貌的。如果您有后续问题,请针对它提出一个 问题(但也许先尝试该调试器建议)。

标签: c++


【解决方案1】:

您的循环没有打印出您期望的结果的原因是因为它基本上是反向工作的,即从 LSB(最低有效位)打印到 MSB(最高有效位)。好好看看自己去探索吧。

那么,在没有帮助数组等的情况下,反向打印数字二进制的解决方案是什么?

int main () {
    int n;
    std::cin >> n;

    // assuming integers are 32-bit
    // works for both positive and negative numbers
    for (int i = 31; i >= 0; --i) {
        if (n & (1 << i))
            std::cout << 1;
        else
            std::cout << 0;
    }

    return 0;
}

@Some programmer dude 一样,使用位移位和其他位算术运算符。了解更多关于他们的信息herehere

【讨论】:

  • 零件是什么? 1 : 0 这是什么意思?我不能使用它,因为我们还没有它......
  • @kp00 我的错!我忘记了您可能没有了解ternary operator 的事实。我将编辑我的帖子,使其使用 if-else 语句。
  • & 是什么意思?
  • @kp00: &amp; 是二元与运算符; &amp;&amp; 是逻辑与运算符。
  • @kp00 &amp; 是二进制 AND 的符号。 &lt;&lt; 是左移位运算符。 1 &lt;&lt; i 相当于将 1 乘以 2 的 i 次方。不明白的地方请google。如果你自己搜索东西,你很可能会找到你作为初学者需要的东西,作为程序员,这是一个很好的习惯。另外,请务必浏览我之前附加的链接。
【解决方案2】:
    int x;
    while(std::cin >> x) {
        auto b = std::bitset<sizeof(x) * 8>{static_cast<unsigned>(x)};
        std::cout << x << ' ' << b << '\n';
    }

https://godbolt.org/z/njzTPo

【讨论】:

  • 如果发帖人还没有学习过数组,那么他们就不太可能了解std::bitset,尤其是如果他们特别提到他们不能使用函数并且需要使用for 来做到这一点和if 和基本操作。
【解决方案3】:

代码如下:

    #include <iostream>
    int main() {
        unsigned long long number;
        std::cin >> number;
        int i = 63;
        /*run until you find the first turn bit*/
        while ((number >> i & 1) == 0 && i >= 0) {
            i--;
        }

        if (i == 0) { // if the i == 0 means the number is 0
            std::cout << 0;
        }
        else {
            for (i; i >= 0; i--) { /* this scope for convert decimal to binary*/
                std::cout << ((number >> i & 1) != 0);
            }
        }
        return 0;
    }

输出: 4 = 0000000100 , 4000000000 = 11101110011010110010100000000000

注意 - 它用于正数。

关于二元与运算符 - &amp;,这里是一个例子:

    x = 60; /* 60 = 0011 1100 */  
    y = 13; /* 13 = 0000 1101 */
    z = 0;           

    c = a & b;       /* 12 = 0000 1100 */ 

为什么会这样:

    0 & 0 -> 0
    0 & 1 -> 0
    1 & 0 -> 0        
    1 & 1 -> 1        

所以我们会得到:

    0011 1100
    0000 1101
    =========
    0000 1100
    

【讨论】:

  • & 是做什么用的?你能用不同的方式表达吗?
  • @kp00: &amp; 是二元与运算符; &amp;&amp; 是逻辑与运算符。
  • @kp00 看看我的代码,我添加了前导零的检查。
  • 谢谢。我找到了一种通过“丢失的箭头”提示消除前导零的方法。但是对于一些较大的值,它会输出 11111111.... 有什么问题?
  • 在你的问题中,你没有提到输入的大小。
猜你喜欢
  • 2014-09-20
  • 2011-01-10
  • 2013-05-13
  • 2012-06-17
  • 2023-04-11
  • 2021-11-18
  • 2016-02-09
  • 2016-08-26
相关资源
最近更新 更多