小伙伴们好,上篇文章我们详细了解了C语言中的操作符,接下来我们来看一些有关操作符的题目。记得三连支持一下哦!
1.不创建临时变量(第三个变量),实现两个数的交换
我们交换两个数通常用的就是用第三个变量去交换,如:
但是这题要求不能使用第三个变量,那该怎么办呢?
其实用按位异或就能很好的决解。我们先来看代码:
我们看这里完成了交换,那是怎么完成的,接下来我们来解释一下:
上篇文章中我们讲到按位异或有几个特点:
1. 任何数字与0异或都等于它自己;
2. 任何数与自己异或都等于0;
3. 1与任何数异或等于任何数取反;
4. 异或支持交换律。
知道这个我们就好理解了:
在这里主要就是有异或的任何数与自己异或都等于0和异或支持交换律的特点。
2.求⼀个整数存储在内存中的⼆进制中1的个数
这里要求我们求二进制中1的个数,我们想到的常规解法就是判断是否能被2整除,然后再不断除2,也是用到了求2进制数的方法,即:
我们可以看到确实可以求正整数的⼆进制中1的个数,那负整数该怎么办呢?所以这一段代码是有缺陷的。
我们在想如果能把一个数的二进制数的每一位表示出来,然后再一个一个判断不就行了。确实可以,这个时候我们就可以使用位操作符和按位与操作符了。
我们可以看到负整数的⼆进制中1的个数也表示出来了,接下来我们来理解一下这段代码:
但是这里,要循环32次,效率不是很高,有没有更高效的方法呢?答案是有的。
我们直接来看代码:
怎么理解呢?
这个方法比较高效但是很难想出来。
3.⼆进制位置0或者置1
编写代码将13⼆进制序列的第5位修改为1,然后再改回0。
13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101
这道题看起来是有点难度的,最主要是没有思路,我们直接来看代码:
来解释一下:
好了,上面就是几个操作符比较经典的题目了,我们可以看到这几个题目,难度是有的,主要还是我们没有操作符这方面的思路,但是只要操作符理解到位了,做这些题目还是没有困难的。
以上就是本篇文章的全部内容了,感谢你的观看,如有错误欢迎指正!创作不易,三连支持一下吧!