0
点赞
收藏
分享

微信扫一扫

十进制转二进制的两种方法

一、除二取余法

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;
}

举报

相关推荐

0 条评论