解题思路:
看了一些题解,都是将数字转成二进制放入数组中,或者栈里面,我认为这道题用位运算来做是最简洁最舒服的,也不用开辟额外数组。

我们知道,数字在计算机的内部都是使用二进制进行存储的,严格来说,存储的是二进制补码,当然正数的二进制补码就是它的二进制原码。

对于n=20来说,在16位的计算机上,它的存储为0000 0000 0001 0100

image.png

如果我想得到它第四位上的数字1 (最低位是第0位)

image.png

那么使用位运算 20>>4&1 就得到了这个数字1

20>>4    “>>”是右移的意思,也就是这个整体向右移动四位,第四位上的1就移到了最低位 也就是整体变成了这个样子

image.png

&1的结果就是最低位的数与1相&的结果,和1做&(与)运算,为1得1,为0得0,这样我们就得到了第四位上的1

回到本题,我们依次从最高位向最低位做这样的运算,高位的0舍弃,从遇到的第一个1开始,后面都打印,得到

image.png

这就是它的二进制

代码表达如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	while(cin >> n) {
		cout << n << "-->";
		// 负数转成正数
		if(n < 0) {
			n = -n;
			cout << "-";
		}
		// 设置标志位 
		bool key = false;
		for(int i = 15; i >= 0; i--) {
			// 将n的二进制数中,第 i 位的数移到最低位,&1即是获取第 i 位的值 
			int z = n >> i & 1;
			// 两种情况 从高位向低位数,遇到第一个1才进入if
			// 然后设置key为真,以后都进入打印 
			if(z == 1 || key) {
				key = true;
				cout << z;
			}
		}
		// kye一直为假,说明n从高位到最低位一直为0,n也就是0 
		if(!key) {
			cout << 0;
		}
		cout << endl;
	}
	return 0;
}

这里设置的key作为标志位,也就是“高位的0舍弃,从遇到的第一个1开始,后面都打印

通过位运算,我们可以更好的理解计算机内部的组成原理,更深入的了解二进制。

以上。


ps:有一个使用递归的做法也挺好的,代码很简洁,缺点是递归对栈的开销比较大
题解链接:十->二进制转换 (C++代码)只做最简单的思路! 作者: 九霄云客 


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论