1.基础语法
- &:按位与。
- |:按位或。
- ~:按位非。
- ^:按位异或。
- <<:左位移运算符。
- >>:右位移运算符。
- >>>:无符号右移运算符。
除去~以外,其他均为二元运算符,操作数只能为整型或者字符型数据。
Java使用 补 码 来 表 示 二 进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。
补 码 的 规 定 如 下 :
- 对 正 数 来 说 ,最高位为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
- 对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。如 -1的补 码 为11111111111111111111111111111111(00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。
- 为何有那么多0、1,java中int是32位的。
1.1.按位与(&)
操作数1 | 操作数2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
例如:0011 & 0101 = 0001
1.2.按位或(|)
操作数1 | 操作数2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
例如:0011 | 0101=0111
1.3.按位非(~)
操作数1 | 结果 |
---|---|
0 | 1 |
1 | 0 |
例如:~01=10
Java求负数的源码中使用了按位非运算。
1.4.按位异或(^)
操作数1 | 操作数2 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
例如:0011^0101=0110
1.5.左位移(<<)
算术左移,符号位不变,低位补0,如2<<2结果为8;
溢出截断:移动超出的部分截断。
例如:
2:0000000000000000000000000000010
2<<2 = 8
8:000000000000000000000000000001000
1.6.右位移(>>)
算术右移,符号位不变,高位补符号位,如-6>>2结果为-2;
溢出截断:移动超出的部分截断。
-6: 11111111111111111111111111111010
-6>>2=-2
-2: 1111111111111111111111111111111010
1.7. 无符号右移(>>>)
低位溢出,高位补0,无符号右移>>>中符号位(最高位)也跟着变!
如-1>>>1= 2147483647(Integer.Max)
-1 : 111111111111111111111111111111111
-1>>>1
Max: 0111111111111111111111111111111111
2.位运算使用场景
2.1.判断一个数n的奇偶性
n&1 == 1 ? “基数”:“偶数”
2.2不用临时变量交换两个数
public static int[] reverse(int[] nums){
int i = 0;
int j = nums.length-1;
while(j>i){
nums[i]= nums[i]^nums[j];
nums[j] = nums[j]^nums[i];
nums[i] = nums[i]^nums[j];
j--;
i++;
}
return nums;
}
原理:a^(b^a) = b
a = a^b;
b = b^a; // b^(a^b) =>b=a
a = a^b; // (a^b)b^(a^v) => a=b
2.3.取绝对值
(a^(a>>31))-(a>>31)
2.4.海明距离
定义
在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。(百度百科)
两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。
作用:
- 用于编码的检错和纠错
为了检测d个错误,需要一个海明距离为d+1的编码方案。因为在这样的编码方案中,d个1位错误不可能将一个有效码字改编成另一个有效码字。当接收方看到一个无效码字的时候,它就知道已经发生了传输错误。类似地,为了纠正d个错误,需要一个距离为2d+1的编码方案,因为在这样的编码方案中,合法码字之间的距离足够远,因而即使发生了d位变化,则还是原来的码字离它最近,从而可以唯一确定原来的码字,达到纠错的目的。
- simhash算法中文本相似度计算也用到了海明距离。
simhash算法将文本表示为64位的二进制hash值,通过计算两个hash值之间的海明距离来代表两个文本间的相似程度。
计算方法:
计算海明距离的一种方法,就是对两个位串进行异或(xor)运算,并计算出异或运算结果中1的个数。例如110和011这两个位串,对它们进行异或运算,其结果是:
110^011=101
异或结果中含有两个1,因此110和011之间的汉明距离就等于2。