位运算规则 :
有符号右位移左边补符号位,正数补0 ,负数补1
无符号右移左边补0
按位与 & 有0 则0
按位或 | 有1则1
按位异或 ^ 不同则1 相同则 0
总:右移一位除以2,左移一位乘以2
1、不用临时变量交换两个整数
int n=2;//0010
int m=3;//0011
// 不同为1,相同为0 n==n^m^m
n=n^m; //0001 = 0010^0011 int 1
m=n^m; //0010 = 0001^0011 int 2
n=n^m; //0011 = 0010^0001 int 3
System.out.println(m+" "+n);
2、判断奇偶数
int n=4,m=5;
if((n&1)==0) {
System.out.println("偶数");
}
if((m&1)==1) {
System.out.println("奇数");
}
3、利用左移运算符计算 m 的第 n个二进制位是什么
int m=3;//0011 0001
int n=1;
System.out.println((m&(1<>n-1);//可以
System.out.println(m>>n-1&1);//对的
4、统计整数num的二进制表示中的1的个数,利用的是num & (num - 1)会将num的二进制表示的最后一位的1变成0
做法一:
int count = 0;
int number = 14;//1110
while(number > 1){
number = number & (number - 1);//将number的二进制表示的最后一位的1变成0
count++;
}
System.out.println(count);
做法二:
int num = 11;//0000 1011 ~num 0000 0101
int coun = 0;
while(num > 0){
num -= num & (~num + 1); // 0000 0001
coun++;
}
System.out.println(coun);
5、判断一个数是不是2的幂。
int num = 18;
num = 16;
if(( num&num - 1) == 0) {
System.out.println("是");
}else {
System.out.println("否");
}
6、判断是不是4的幂
int n=32;
if((n & n - 1) == 0){
if((n & 0x55555555)==0){
System.out.println("是");
}else{
System.out.println("否");
}
}
7、不使用+,-,*,/完成整数相加
int n = 12;//0000 1100
int m = 5; //0000 0101
int sum = 0;
while( m != 0) {
sum = n ^ m;//0000 1001 循环求不同
m = ( n & m ) << 1;//0000 1000 满2进1
n = sum;
}
System.out.println(n);