Java位运算
位运算符
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,不同为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0.相当于乘2 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
位运算符常用方式
用位运算做加法
1 | //step1:异或查看两个数进行加法操作后的结果 |
用位运算求平均数
1 | public int average(int a,int b){ |
原理:
每一位都0,1有两种情况,所以对应的每一位相加有3种情况
1.(0+0):0&0和0^0都是0
2.(1+0)或(0+1):1&0为0,1^0为1;而1+0为1,所以相加的结果刚好是与的结果,要求平均数所以右移一位,相当于除以二
3.(1+1):1&1为1,1^1为0,而1+1为2,所以刚好是异或的结果刚好是平均数
二进制中1的个数
1 | public class Solution{ |
原理:
a = a & (a-1);
a异或a-1的结果刚好为a去掉二进制时的最后一位1的结果
判断一个数的奇偶性
1 | public void Test(int a){ |
两数的中位数
1 | public void Test(int a,int b){ |
不使用第三个变量的情况下交换两个变量的值
1 | //原理:运用异或的特性 |
原理:
x = x ^ y;y = x ^ y;x = x ^ y;
z = x ^ y;y = z ^ y;x = z ^ y;