解题思路:
看了一些题解,都是将数字转成二进制放入数组中,或者栈里面,我认为这道题用位运算来做是最简洁最舒服的,也不用开辟额外数组。
我们知道,数字在计算机的内部都是使用二进制进行存储的,严格来说,存储的是二进制补码,当然正数的二进制补码就是它的二进制原码。
对于n=20来说,在16位的计算机上,它的存储为0000 0000 0001 0100
如果我想得到它第四位上的数字1 (最低位是第0位)
那么使用位运算 20>>4&1 就得到了这个数字1
20>>4 “>>”是右移的意思,也就是这个整体向右移动四位,第四位上的1就移到了最低位 也就是整体变成了这个样子
&1的结果就是最低位的数与1相&的结果,和1做&(与)运算,为1得1,为0得0,这样我们就得到了第四位上的1
回到本题,我们依次从最高位向最低位做这样的运算,高位的0舍弃,从遇到的第一个1开始,后面都打印,得到
这就是它的二进制
代码表达如下:
#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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复