请解释一下这个特殊的C++代码,用于将十进制转换为二进制[已关闭]

332nm8kg  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(132)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

4小时前关门了。
Improve this question
有谁能用一两个例子解释一下下面的C++代码是如何将十进制转换成二进制的吗?我知道其他的方法,但是这个方法是不理解的。

# include < bits/stdc++.h>

using namespace std;

int DecimalToBinary (int n)
{
   int x = 1;
   int ans = 0;

   while (x <= n)
   {
     x *= 2;
   }

   x/=2; 

   while (x>0)
   {
       int lastDigit = n/x;

       n -= lastDigit*x;
       x/=2;

       ans = ans*10 + lastDigit;
   }

   return ans;
}

int 32_t main () {
   int n;

   cin >> n;

   cout << decimalToBinary (n) << end l;
}
qv7cva1a

qv7cva1a1#

此代码基本上分为两部分:
当(x ≤ n){ x *= 2;}
x/=2;
然后这部分。
当(x〉0){整数最后一位数= n/x;

n -= lastDigit*x;
   x/=2;

   ans = ans*10 + lastDigit;

}
最上面的部分是找出你的数字有多大,基本上,它一直把x翻倍,直到它大于你输入的数字,然后它后退一位,让我们用一个输入数字的例子-- 6。在十进制中,这是110。
然后第二部分开始构建输出,一次构建一个十进制值。
然而,这是一个非常糟糕的方法。非常糟糕。对于任何稍微大的数字,你都会溢出你的ans变量。这是最大的问题。无论你从哪里得到这个代码,不要再相信那个来源了。
但是让我们把这个循环分解一下,首先,直到你把x除到0,它循环,所以在输入为6的情况下,x是4(如我所概述的),然后第一个循环,x是4,然后2,然后1,然后0,所以它停止,它循环了3次。
让我们倒过来看看。

ans = ans*10 + lastDigit;

第一次,ans是0,所以ans*10也是0,所以我们加上lastDigit,这实际上是前面的二进制数,记住,n是7,x是4,6 / 4 == 1(这里是整数运算,不是浮点运算),所以ans现在是1,这是第一位数,我们还从n中减去4,所以现在是2。
循环2,n现在是2,x也是2。2/2是1,所以ans变成了ans * 10 == 10 + 1,所以是11。我们已经从2中减去2,所以n现在是0。
最后一次,0 / 1 == 0,所以我们得到110。
但这仍然是一个非常糟糕的方法。至少,由于溢出问题,它应该以其他格式存储结果。

相关问题