大家好,又见面了,我是你们的朋友全栈君。
导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制数转换成二进制数。
原文的实现方式太年轻了,是我大一的时候写的。由于太多小伙伴被『溢出』困扰(在溢出的情况下原文的实现就不灵了),补充下面这种最佳的实现方式。
最佳的方式是利用栈先进后出的特性,计算每一位(0或1)压入栈中,再将所有元素出栈得到的01串就是目标二进制数。以下为C++实现代码,想用C语言实现的可以进行相应的改造,用数组实现一个栈,用字符数组实现字符串。
#include <iostream>
#include <stack>
using namespace std;
string transfer(int x) {
if (x == 0) {
return "0";
}
string ret;
stack<char> st;
while (x > 0) {
if (x % 2 == 1) {
st.push('1');
} else {
st.push('0');
}
x /= 2;
}
while (!st.empty()) {
ret.push_back(st.top());
st.pop();
}
return ret;
}
int main() {
int x;
cin >> x;
cout << transfer(x) << endl;
return 0;
}
下面是大一时候的实现,没有考虑溢出的问题,对于不懂栈的同学可以看一下。
先将源代码展示给大家:
#include <stdio.h>
void main()
{
//进制转换函数的声明
int transfer(int x);
int x;
printf("请输入一个十进制数:");
scanf("%d",&x);
printf("转换成二进制数是:%d\n",transfer(x));
}
int transfer(int x)
{
int p=1,y=0,yushu;
while(1)
{
yushu=x%2;
x/=2;
y+=yushu*p;
p*=10;
if(x<2)
{
y+=x*p;
break;
}
}
return y;
}
具体算法体现在函数体内,使用了一个while(1)的死循环,当结果产生后跳出循环。变量yushu是每一次循环内产生的余数,变量x每次循环都会被赋予新的值,这个新的值就是每一次循环内产生的商。当产生的商小于2时即产生了最后的结果(二进制数),然后跳出循环。
例如:函数自变量若为7,用自变量7除以2,得到第一次循环产生的余数为1,第一次循环产生的商为3;用第一次循环产生的商3除以2,得到第二次循环产生的余数为1,第二次循环产生的商为1。
变量y的存放也是有一定技巧的,由于每次产生的余数都小于2并且都是最后二进制数中需要按位展现出来的,因此每一次循环产生的余数都要合理地进行存放。第一次产生的余数放在个位,第二次产生的余数放在十位,第三次产生的余数放在百位……依次类推,直至某一次循环产生的商小于2,最后再把小于2的那个商放在最高位。变量p的作用就是控制位数,变量y的初始值定为0,变量p的初始值定为1,每次循环内变量p都自乘10,每次循环内都让变量y加上yushu*p,这样就实现了余数的按位存放。最后将小于2的那个商乘以p加到变量y中,得到最后的二进制数。
例如:还是以自变量7为例,第一次循环后y的值为1,第二次循环内if语句之前y的值为11,if语句内y的值变为111,111即为7的二进制数。
注意:变量p的自乘要放在变量y加上yushu*p之后!顺序不能颠倒!
欢迎大家关注/订阅我的微信公众号Code Art Online,我会在我的公众号分享个人见闻,发现生活趣味;这里不仅有0和1,还有是诗和远方↓↓↓
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144527.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...