Java 逻辑运算符、位运算符、移位操作符 总结 作者:王可利(Star·星星)
逻辑运算符,表格如下:
解析逻辑运算符表:
1.与 (&)
特点:两个都为真的时候,结果为真。两个为假的时候,结果为假。如果存在一个是假的,结果都为假的。
2.或(|)
特点:两个都为真的时候,结果为真。两个都为假的时候都是假的。如果存在一个是真的,结果都为真的。
3.异或(^)
特点:异,表示不一样的意思。所以两个判断都是一样的情况下,结果为假。两个判断结果都是不一样的情况下,结果为真的。
4.非(!)
特点:取非,如果是真的,那么结果就为假的。如果是假的,那么结果就为真的。
5.双与(&&)、双或 (||) ——>短路
特点:
在java里面,单个与(或) 和 两个与(或)运算方式是不一样,结果是一样的。
单个与(或)会把所有的条件都判断一次,运算方式,不管第一个条件是假的还是真的,都会把后面的条件判断完了之后再输出结果。
两个与(或),如果第一个数是真的,或者是假的就直接运行了,就不会再判断后面的条件,但是输出的结果真假和单与(或)没什么不一样。
所以单个与(或)要比 两个 两个与(或)效率稍微高了一点。
位运算符
介绍:任何信息在计算机中都是以二进制的形式保存的,与(&)、或(|)、异或(^)除了可以作为逻
辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。
位(bit)运算符:
位运算符
| 运算符含义
|
& | 与(AND) |
| | 或(OR) |
^ | 异或 |
~ | 取反 |
规则:非零即真,所以 1 为 true ,0 为 false
参考逻辑运算符可以得出以下结论:
只有参与运算的两位都为1,&运算的结果才为1,否则就为0。
只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。
只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。
1、& 与运算
& 参见运算的两位数都为1,&运算符结果才为1,否则就为0。
6 & 3
00000000 | 00000000 | 00000000 | 00000110 | 6 |
00000000 | 00000000 | 00000000 | 00000011 | 3 |
00000000 | 00000000 | 00000000 | 00000010 | & = 2 |
2、| 或运算
| 参与运算的两位都为0,|运算的结果才为0,否则就为1。
6 & 3
00000000 | 00000000 | 00000000 | 00000110 | 6 |
00000000 | 00000000 | 00000000 | 00000011 | 3 |
00000000 | 00000000 | 00000000 | 00000111 | | = 7 |
3、^ 异或运算
^只有参加运算的两位不同,^运算的结果才为1,否则就为0。
6 & 3
00000000 | 00000000 | 00000000 | 00000110 | 6 |
00000000 | 00000000 | 00000000 | 00000011 | 3 |
00000000 | 00000000 | 00000000 | 00000101 | ^ = 5 |
4、~ 反码
就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。
0000-0000 | 0000-0000 | 0000-0000 | 0000-0110 | 6 |
1111-1111 | 1111-1111 | 1111-1111 | 1111-1001 | 取反 -7 |
System.out.println(~6);//-7
结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;
当参与取反的数值是负数时,把对应的值加上负号,再-1;
负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。
负数表示
负数对应的正数的二进制-1,然后取反。
-6
0000-0000 | 0000-0000 | 0000-0000 | 0000-0110 | 6 |
1111-1111 | 1111-1111 | 1111-1111 | 1111-1001 | 取反 |
1111-1111 | 1111-1111 | 1111-1111 | 1111-1010 | 加1 |
5、异或特点
一个数异或同一个数两次,结果还是那个数. 用处一个简单的加密思想.
6^3^3
0000-0000 | 0000-0000 | 0000-0000 | 0000-0110 | 6 |
0000-0000 | 0000-0000 | 0000-0000 | 0000-0011 | ^3 |
0000-0000 | 0000-0000 | 0000-0000 | 0000-0101 | 前面的结果 |
0000-0000 | 0000-0000 | 0000-0000 | 0000-0011 | ^3 |
0000-0000 | 0000-0000 | 0000-0000 | 0000-0110 | 结果是6 |
移位操作符
表格如下:
位运算符 | ||
运算符 | 运算 | 范例 |
<< | 左移 | 3 << 2 = 12 –> 3*2*2=12 |
>> | 右移 | 3 >> 1 = 1 –> 3/2=1 |
>>> | 无符号右移 | 3 >>> 1 = 1 –> 3/2=1 |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 反码 | ~6 = – |
位运算符的细节 | |
<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
>> | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
| | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ | 任何相同二进制位进行 ^ 运算,结果是0。 1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1 |
解析表内容:
1、左移(算术移位)
3 << 2
首先将3转换为2进制,
00000000 | 00000000 | 00000000 | 00000011 | 3 的二进制 | ||
00000000 | 00000000 | 00000000 | 000011 | 左移2位,砍掉高位 | ||
0000 0000 | 0000 0000 | 0000 0000 | 0000 1100 | 低位补0 | ||
结果是12,所以3<<2 = 12;
结论:左移就相当于乘以2的位移个数次幂.
2、右移
6>>2
00000000 | 00000000 | 00000000 | 00000110 | 6的二进制 | ||
000000 | 00000000 | 00000000 | 00000001 | 右移10被砍掉 | ||
00000000 | 00000000 | 00000000 | 00000001 | 高位补0 | ||
结果是1,所以6>>2 = 1;
结论:右移两位就是除以 2的2次方,右移一位就是除以 2的一次方。一个数往左移越移越大,往右边移越来越小。
3、无符号右移(逻辑移位)
通过演示发现右移时高位就空了出来,>> 右移时高位补什么要按照原有数据的最高位来决定。
1111-1111 1111-1111 1111-1111 1111-1010 -6 >> 2
1111-1111 1111-1111 1111-1111 1111-0010
最高位补什么要看原有最高位是什么
那么使用>> 后原来是最高位1 的那么空出来的最高位还是1 的,是0的还是0。
如果使用>>> 无论最高位是0还是1 空余最高位都拿0 补,这就是无符号右移。
1111-1111 1111-1111 1111-1111 1111-1010 -6 >>> 2
001111-1111 1111-1111 1111-1111 1111-10
结果是;1073741822