一、除二取余法
1.笔试方法
此时67用二进制表示为1000011(注意要从下往上写,因为下面累计除的2最多,所表示的是2的高次方,为二进制高位)
2.代码表示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int binary(int numb) {
int bin_numb = 0;
int i = 0; //计数器
do {
bin_numb = bin_numb +(numb % 2)*pow(10,i); //pow为power的缩写,是C语言计算幂的函数,需要调用头文件<math.h>
i++;
numb/=2;
} while (numb > 0);
return bin_numb;
}
int main() {
int numb = 0;
scanf("%d", &numb);
int bin_numb=binary(numb);
printf("%d", bin_numb);
return 0;
}
3.缺点
(1)无法求负数补码的二进制,如-1的补码为11111111 11111111 11111111 11111111 ,无法用除二取余法。
(2)数值太大时,无法单独用一个整形数表示十进制的01序列,比如仅仅用int a无法存储十进制的01111111 11111111 11111111 11111111。此时应该从高位到低位用函数直接打印出来,而不是用函数返回一个数值。
二、右移与一法
1.思路
任何二进制与0结果为0,与1结果为其本身
(1)-67的补码为11111111 11111111 11111111 10111101 用其与00000000 00000000 00000000 00000001得
00000000 00000000 00000000 00000001(表示-67补码的最末位为1)
之后把-67的补码右移一位后得11111111 11111111 11111111 11011110
(2)再与00000000 00000000 00000000 00000001,得到倒数第二位的数值00000000 00000000 00000000 00000000 (表示-67补码的倒数第二位为0),再把-67的补码右移两位。
(3)再与1,再右移3位,直到与了32次,就能把每一位都打印出来。
2.代码实现
吸取缺点(2)的教训,在代码中要从高到低打印,所以先右移31位,与1;右移30位,与1;…………;右移0位,与1。
void print_binary(numb) {
for (int i = 31;i >=0;i--) {
int a = numb >> i; //右移不改变数值本身,要用变量存储
printf("%d",a&1 );
}
}
int main() {
int numb = 0;
scanf("%d", &numb);
print_binary(numb);
return 0;
}