int a =5;// 0000 0000 0000 0000 0000 0000 0000 0101int b =-5;// 1111 1111 1111 1111 1111 1111 1111 1011int c =2;// 0000 0000 0000 0000 0000 0000 0000 0010int res = a & c;// 0000 0000 0000 0000 0000 0000 0000 0000
res = a | c;// 0000 0000 0000 0000 0000 0000 0000 0111
res = a ^ c;// 0000 0000 0000 0000 0000 0000 0000 0111
res =~a;// 1111 1111 1111 1111 1111 1111 1111 1010
res = a << c;// 0000 0000 0000 0000 0000 0000 0001 0100
res = a >> c;// 0000 0000 0000 0000 0000 0000 0000 0001
res = b >>> c;// 0011 1111 1111 1111 1111 1111 1111 1110
2、位运算的应用
2.1 取模运算
若a、b均为正数,且b是2的n次方(n为自然数),则取模操作 a % b,等价于 a & (b - 1)。
例如:
33%16=1 等价于 33&15=121%8=5 等价于 21&7=5
2.2 奇偶性判断
偶数 & 1 = 0
奇数 & 1 = 1
例如:
4&1=05&1=1
2.3 交换变量的值
结论:一个数与另一个数异或两次等于该数本身。
例1:给定两个变量,在不引入第三个变量的情况下,交换这两个变量的值。
int a =3, b =4;
a = a ^ b;
b = a ^ b;// 相当于b = (a ^ b) ^ b = a
a = a ^ b;// 相当于a = (a ^ b) ^ a = b
例2:给定一组数,其中只有一个数出现一次,其它数都出现两次,找出只出现一次的数。
int[] arr ={6,2,7,15,33,2,18,75,6,33,15,75,7};int n = arr[0];for(int i =1; i < arr.length; i++){
n = n ^ arr[i];}System.out.println("只出现一次的数:"+ n);// n = 18