C语言06(操作符)
目录
学前须知:
1.移位操作符(<<,>>)
1.1左移操作符
2.2右移操作符
2.位操作符(&,|,^,~)
2.1位操作符的作用
2.2位操作符解题
2.2.1 第一题
2.2.2 第二题
3.逗号表达式
4.总结
学前须知:
1.数据在计算机中是以补码存储的。
2.位移操作符,位操作符直接对内存中存储的补码进行运算。
3.正数的原码,反码,补码均相同。
4.负数原码转为补码,补码转为原码都是符号位不变,数值位取反再+1 。
1.移位操作符(<<,>>)
1.1左移操作符
已知int型数据在内存中占4个字节的大小,且int默认是有符号整数,10的二进制为1010,当左移之后最左边的二进制位会溢出而被抛弃,最右边的数默认补0,因此数值变成了20。
另外还需注意,我们虽然对num << 1,但是num本身的值是不会变的,还是10。
2.2右移操作符
右移操作符和左移操作符大体上一样,但是也有区别,主要分为两种。
1.逻辑右移:左边空出来的用0填充,右边丢弃。
2.算数右移:左边用该值的原符号位填充,右边丢弃。
那么我们该如何判断是逻辑右移还是算术右移,这个我们可以自己验证一下。
假如说给一个负数,比如说-10,他的符号位是1,那么我们假设我们使用的编译器是算术右移,那么-10的补码右移过后,最左边就应该补1,得到的还是一个负数,那如果我们编译器得到的是逻辑右移呢,右移之后,左边补0,也就是说最后得到的是一个正数。
简单来说:给一个负数,如果右移过后的结果是正数,那么就是逻辑右移,如果结果还是负数,那么就是算数右移。
可以看出-10右移之后的结果是-5,还是一个负数,因此我们使用的解释器使用的是算术右移。同样,我们对num >> 1之后,num本身的值不会发生变化。
2.位操作符(&,|,^,~)
2.1位操作符的作用
& //按位与 | //按位或 ^ //按位异或 ~ //按位取反需注意:位操作符的操作数只能是整数。
作用:
1.按位与:对齐的二进制位如果有一个0,该位按位与之后的结果就是0。
2.按位或:对齐的二进制位如果有一个1,该位按位或之后的结果就是1。
3.按位异或:对齐的二进制位只要不相同,该位异或之后的结果就是1。
以上三个操作符的操作数都是2个。
4.按位取反:操作数只有一个,0变1,1变0。
具体如下:
2.2位操作符解题
使用位操作符解题时我们需要先知道关于异或的一些操作
1. a ^ 0 之后的结果还是a
2. a ^ a 之后的结果是0
3.异或支持交换律,也就是说 a ^ b ^ a 其实等同于 a ^ a ^ b ,那么我们就能进一步得到 a^a^b
-> 0^b -> b
以上的结论都可以自己用数值验证。
2.2.1 第一题
如何在不创建第三个变量的前提下,实现两数交换
2.2.2 第二题
3.逗号表达式
4.总结
通过以上内容,我们可以总结一下位操作符的一些运算技巧。
1. a ^ 0 之后的结果还是a
2. a ^ a 之后的结果是0
3. 异或支持交换律
4. n & 1能得到n最后一位是1还是0
5. 每次执行 n = n & (n-1) 得到的结果中,n最右边的1会变成0
