解题思路:
看了一些题解,都是将数字转成二进制放入数组中,或者栈里面,我认为这道题用位运算来做是最简洁最舒服的,也不用开辟额外数组。
我们知道,数字在计算机的内部都是使用二进制进行存储的,严格来说,存储的是二进制补码,当然正数的二进制补码就是它的二进制原码。
对于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分
159 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:723 |
1011题解浏览:819 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:702 |
1128题解(返回值为数组的情况)浏览:571 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:523 |
前10名 (C语言代码)浏览:773 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:692 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:456 |
P1002 (Java代码)浏览:840 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)(标记法)浏览:709 |