指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:52306

签 名:

个人博客:blog.imtwa.top

等  级
排  名 11
经  验 26490
参赛次数 49
文章发表 128
年  龄 0
在职情况 学生
学  校
专  业 物联网工程

  自我简介:

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

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

对于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分

159 人评分

  评论区

  • «
  • »