二进制转换
二进制的转换分为两部分:整数部分和小数部分
二进制整数转换
给定一个整数$a$,把$a$不断的除以$2$,将余数压入栈$s$,输出的时候按出栈的顺序输出$s$即可
再用位运算提高含水量
while (a) {
s[cnt++] = a & 1;
a >>= 1;
}
while (cnt--)
cout << s[cnt];
cout << endl;
当然我们还需要一个小小的特判
因为如果输入的$a$为$0$,
则while
循环就不会执行
cnt
就会为$0$,
就不会输入,因此要加上判断条件判断
while (a) {
s[cnt++] = a & 1;
a >>= 1;
}
if (cnt == 0)
cout << 0;
while (cnt--)
cout << s[cnt];
cout << endl;
接下来是重头戏,小数部分
二进制小数转换
给定一个纯小数部分$b$,把$b$不断乘以$2$,
将整数部分入队列$q$,并且将$q$再次化成纯小数。
直到$b$为$0$
while (b > 0) {
b *= 2;
if (b >= 1) {
q[s++] = 1;
b -= 1;
} else
q[s++] = 0;
}
cout << "0.";
for (int i = 0; i < s; i++)
cout << q[i];
cout << endl;
但是还要进一步特判是否为$0$
那就会多一个"."
while (b > 0) {
b *= 2;
if (b >= 1) {
q[s++] = 1;
b -= 1;
} else
q[s++] = 0;
}
cout << "0";
if (s > 0)
cout << '.';
for (int i = 0; i < s; i++)
cout << q[i];
cout << endl;
总结二进制转换代码
提示:可能会和讲解内容有一些不符
#include <bits/stdc++.h>
using namespace std;
bool b[1000005], c[1000005];
long long a, s, cnt;
double n;
int main() {
scanf("%lf", &n);
a = int(n);
n -= a;
while (a) {
b[cnt++] = a & 1;
a >>= 1;
}
while (n > 0 & s < 1000005) {
n *= 2;
if (n >= 1) {
c[s++] = 1;
n -= 1;
} else
c[s++] = 0;
}
for (int i = cnt - 1; i >= 0; i--)
cout << b[i];
if (s != 0)
cout << '.';
for (int i = 0; i < s; i++)
cout << c[i];
cout << endl;
return 0;
}