java位运算符
位于算符 | 符号解释 |
---|---|
& | 按位与 当两位同为1时返回1 |
| | 按位或,只要有一位为1即返回1 |
~ | 按位非,将操作数每个位(包括符号位,全部取反) |
^ | 按位异或 两位相同时返回0,不相同时返回1 |
<< | 左移运算符 |
>> | 右移运算符 |
符号的介绍:
- &(与) -> 有假则假
- |(或) -> 有真则真
- ~(非) -> 取反
- ^(异或) -> 符号前后结果一样为false,不一样为true
true ^ true -> false
false ^ false -> false
true ^ false -> true
false ^ true -> true
1代表true 0代表false
我们要知道计算机在存储数据的时候都是存储的数据的补码,计算也是用的数据的补码
但是我们最终看到的结果是原码换算出来的
原码 反码 补码
正数二进制最高位为0; 负数二进制最高位为1
如果是正数 原码 反码 补码 一致
比如:5的原码 反码 补码一致:
0000 0000 0000 0000 0000 0000 0000 0101 -> 因为是正数,二进制最高位为0
如果是负数,原码 反码 补码不一样了
反码是原码的基础上最高位不变,剩下的0和1互换
补码是在反码的基础上+1
比如:-9
原码: 1000 0000 0000 0000 0000 0000 0000 1001
反码: 1111 1111 1111 1111 1111 1111 1111 0110
补码: 1111 1111 1111 1111 1111 1111 1111 0111
左移:<<
运算规则:左移几位就相当于乘以2的几次方
注意当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
2<<2 //结果等于8
//快速算法: 2*(2的2次方)
-2<<2 等于-8
快速算法: -2*(2的2次方)
右移:>>
快速运算:类似于除以2的n次,如果不能整除,向下取整
9>>2 //等于2
//快速算法: 9除以(2的2次方)
-9>>2 //等于-3
//快速算法: -9除以(2的2次方)
无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不管最高位是0还是1空出来的都拿0补
正数:和右移一样
9>>>2 //等于2
负数:右边移出去几位,左边补几个0,结果变为正数
-9>>>2
//结果为:1073741821
按位与:&
小技巧:将0看成为false 将1看成true
运算规则:对应位都是1才为1,相当于符号左右两边都为true,结果才为true
-
1&1 结果为1
-
1&0 结果为0
-
0&1 结果为0
-
0&0 结果为0
5&3 //结果1
按位或:|
运算规则:对应位只要有1即为1,相当于符号前后只要有一个为true,结果就是true
-
1|1 结果1
-
1|0 结果1
-
0|1 结果1
-
0|0 结果0
5|3 //结果为7
按位异或:^
运算规则:对应位一样的为0,不一样的为1
-
1^1 结果为0 false
-
1^0 结果为1 true
-
0^1 结果为1 true
-
0^0 结果0 false
5^3 //结果为6
按位取反
运算规则:~0就是1
~1就是0
~10 //结果为-11