符号 | 功能 | 记忆技巧 |
---|---|---|
& | 按位与 | 有0则0 |
| | 按位或 | 有1则1 |
^ | 按位异或 | 相同为0,不同为1 |
~ | 单目取反 | 0变1,1变0 |
<< | 左移 | 移位右边补0 |
>> | 右移 | 右移左边补0 |
*位运算只针对整型和字符型,而且是直接对二进制进行操作
按位与&
这个符号其实和逻辑与运算&&意思一样,只不过作用在每一位上。
有0则0:
对于每一位来说,两个数都是真。则为真,否则位假。
3-> 0b 0000 0011
2-> 0b 0000 0010
3&2 ->0b 0000 0010
按位与|
同理,和逻辑或运算||意思一样,只不过作用在每一位上。
有1则一:
对于每一位来说,但凡有个真的就是真,否则为假。
3 -> 0b 0000 0011
2 -> 0b 0000 0010
3|2 ->0b 0000 0011
按位异或^
相同为0,不同为1:
对于每一位来说,只要相同就为0,不同就为1。
3 -> 0b 0000 0011
2 -> 0b 0000 0010
3^2 ->0b 0000 0001
按位取反~
取反就是一个单目运算符,对每一位进行取反,即0变1,1变0
6 -> 0b 0000 0110
~6 -> 0b 1111 1001 //补码:最高位变成了符号位,所以结果肯定是一个负数
0b 1000 0110 //反码
0b 1000 0111 //原码
result: -7
左移
左移操作就是把这些0啊1啊的整体往左移动n位,右边缺的就补0。(这个单片机里面常用)
3 -> 0b 0000 0011
3<<1 -> 0b 0000 0110 ==6
2 -> 0b 0000 0010
2<<2 ->0b 0000 1000 == 8
大家可以发现,左移1位之后这个数相当于乘2。但是这只适用于左边溢出的高位中不包含1时。如果把1扔了,那就肯定不是2倍了。
右移
右移操作就是整体往右移动n位,左边缺的补充符号位(0)。
3 -> 0b 0000 0011
3>>1 -> 0b 0000 0001 ==1
2 -> 0b 0000 0010
2>>2 -> 0b 0000 0000 == 0
跟上面说的一样,正数右移的时候就是这个数除以2。
-----------20223/6/23