&&是逻辑与
“与”就是“并且”的意思,比如现在有一个数字a,
a < 1 && a > 0
就是表示a在0和1之间;
表达式1 | 表达式2 | 逻辑与结果 |
True | True | True |
True | False | False |
False | True | False |
False | False | False |
"逻辑与"关注的是符号两边数的真值。有0为0(C语言中可以这样看:0是False,0以外的值都为True)
||是逻辑或
a > 1 || a < 0
就表示a比一大,或者a比零更小。
表达式1 | 表达式2 | 逻辑与结果 |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
"逻辑或"关注的是符号两边数的真值。同0为0(C语言中可以这样看:0是False,0以外的值都为True)
&是位与 |是位或
& 按位与
| 按位或
^ 按位异或
<< 按位左移
>> 按位右移
~ 按位取反
1. 按位与(AND):&
一定要将&与&&区分开来,后者是逻辑与。
(1)按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.
0 & 0 = 0;
0 & 1 = 0;
1 & 1 = 1;
(2)根据这个特性,&操作常常用来屏蔽特定的二进制位。例如:
0000 1111 & 0000 0011
结果为0000 0011 可以看见,1111的前两位被屏蔽成为0了。
所以如果想清空数据,只需要将原二进制数与上0就可以了。0的位数对应原二进制数的位数,对各位进行屏蔽,全部置0.
相对的,&可以利用0来屏蔽,也可以用1来读取。
例如: 一个二进制数 1101 1001,我只想要它的后四位,怎么办呢?
只需要进行如下操作:1101 1001 & 0000 1111即可。
其实该方法是屏蔽和读取的结合,&0保证消除无用位,&1保证有用数据的完整性。
总结:对于原二进制数来说,&0是屏蔽,&1是不变。
2.按位或(OR):|
同样,不要将“|”和“||”(逻辑或)搞混。
(1)定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
(2)特殊用处:
将某些特定位置1.
例如:1010 0000 | 0000 1111.
结果为 1010 1111.
总结:对于原二进制数来说,|0是不变,|1是置1.
3.按位异或:^
^这个符号我们常用来表示次方。不过在计算机中,它代表的就不是次方的意思了。
(1)定义
只要参与运算的双方互异,结果就为1,否则为0.
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
0 ^ 0 = 0;
(2).用法
可以通过上面的定义看到,一个数^1的话就会0变成1,1变成0,而^0则不对原数进行改变。所以根据此特性可以对特定位进行0 1 反转。
例如: 1100 1100 ^ 0000 1100
结果为 1100 0000.
同样的,如果对一个数进行^0,代表保留原值。
总结:对于原二进制数来说,^0是不变,^1是反转。
4. 取反(~)
对一个二进制数进行取反。1变0,0变1.
唯一需要注意的一点是,~的优先级是逻辑运算符中最高的,必须优先计算。
5. 左移,右移
左移与右移比较类似,是将目标二进制数字向左/右移动相应的位数。
左移补0:1111 1111 << 1 == 1111 1110,换算十进制的话是原来数值的2倍。
右移看情况:负数补1,正数补0.需要看符号位。同样,换算为十进制数值变为原来的1/2.
总结:左乘右除。