位运算符
位运算符有哪些?
& 位与
| 位或
^ 位异或
>> 向右移
>>> 无符号右移
<< 向左移
位运算符都是操作的二进制
用法:
&,|,^ 的用法
&:有0则0
|:有1则1
^:相同则0,不同则1
例:
System.out.println(6 & 3); //2
System.out.println(6 | 3); //7
System.out.println(6 ^ 3); //5
分析:
上面这些运算符会将数字转换成2进制再进行运算。6的二进制是110,3的二进制是011。根据上面的用法规则里面,列几个竖式:
110
& 011
-----------
010 十进制的2
110
| 011
-----------
111 十进制的7
110
^ 011
-----------
101 十进制的5
^的特点:一个数据对另一个数据位异或两次,该数本身不变。
例:
System.out.println(5 ^ 10 ^ 5);
左移和右移
<<:左移 左边最高位丢弃,右边补齐0
>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
>>>:无符号右移 无论最高位是0还是1,左边补齐0
例:
//右移,向右移动n位就是除以2的n次幂,向左移动n位就是乘以2的n次幂
//System.out.println(12 >> 1);
//System.out.println(12 >> 2);
//System.out.println(12 << 1); //24
//System.out.println(12 << 2); //48
小练习
1、请实现两个整数变量的交换(不能使用第三方变量)
2、最有效率的算出2 * 8的结果
答案:
1、实现两个整数变量的交换很简单,但是这道题目却明确指出不能使用第三方变量。有两种方法。
方法一:
int a = 20;
int b = 10;
a = a + b;
b = a - b;
a = a - b;
方法一有个缺点,如果数值超出了int类型的取值范围,将会损失精度
方法二:
int a = 20;
int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
2、直接操作二进制是比较快的,所以使用左移符号
System.out.println(2 << 3);
来源:https://blog.csdn.net/weixin_45370202/article/details/98886094