我们都知道计算机里的数据都是以二进制形式存储的,所谓的位运算可以理解为直接对内存中的二进制数据进行操作,所以速度会比较快。
这边先写个二进制输出方法
private static void printBinaryNumber(int n){
String num = Integer.toBinaryString(n);
if(num.length() == 32){
System.out.println(num);
}else{
StringBuilder sb = new StringBuilder("");
for(int i = 0;i < 32 - num.length(); i ++){
sb.append("0");
}
System.out.println(sb.toString() + num);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
privatestaticvoidprintBinaryNumber(intn){
Stringnum=Integer.toBinaryString(n);
if(num.length()==32){
System.out.println(num);
}else{
StringBuildersb=newStringBuilder("");
for(inti=0;i<32-num.length();i++){
sb.append("0");
}
System.out.println(sb.toString()+num);
}
}
位操作符介绍
1、~操作符(取反),对应二进制位取反,0变成1,1变成0
int num = 5;
printBinaryNumber(num);
printBinaryNumber(~num);
1
2
3
intnum=5;
printBinaryNumber(num);
printBinaryNumber(~num);
结果
2、&操作符(与),对应二进制位进行与操作,都为1时变成1,其他变为0
int num1 = 5;
int num2 = 6;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1 & num2);
1
2
3
4
5
intnum1=5;
intnum2=6;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1&num2);
结果
3、|操作符(或)对应二进制位进行或操作,都为0时变成0,其他变为1
int num1 = 2;
int num2 = 9;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1 | num2);
1
2
3
4
5
intnum1=2;
intnum2=9;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1|num2);
结果
4、^操作符(异或),对应二进制位相同时,该位变成0,否则变成1
int num1 = 3;
int num2 = 9;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1 ^ num2);
1
2
3
4
5
intnum1=3;
intnum2=9;
printBinaryNumber(num1);
printBinaryNumber(num2);
printBinaryNumber(num1^num2);
结果
5、<
int num = 3;
printBinaryNumber(num);
printBinaryNumber(num << 2);
1
2
3
intnum=3;
printBinaryNumber(num);
printBinaryNumber(num<<2);
结果
6、>>操作(右移),二进制位向右移动,左边填充0
int num = 4;
printBinaryNumber(num);
printBinaryNumber(num >> 2);
1
2
3
intnum=4;
printBinaryNumber(num);
printBinaryNumber(num>>2);
结果
常见的位操作应用
1、不使用中间变量交换两个数
int num1 = 3;
int num2 = 9;
num1 = num1 ^ num2;
num2 = num2 ^ num1;
num1 = num1 ^ num2;
System.out.println("num1:" + num1 +"\n"+ "num2:" + num2 );
1
2
3
4
5
6
intnum1=3;
intnum2=9;
num1=num1^num2;
num2=num2^num1;
num1=num1^num2;
System.out.println("num1:"+num1+"\n"+"num2:"+num2);
结果
2、求2的N次方
//求2的16次方:
System.out.println(Math.pow(2, 16));
System.out.println(1L << 16);
1
2
3
//求2的16次方:
System.out.println(Math.pow(2,16));
System.out.println(1L<<16);
结果
3、判断奇数偶数
int num1 = 2;
int num2 = 7;
if(num1 % 2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
System.out.println((((int)num1 & 1) == 1) ? "奇数" : "偶数");
System.out.println((((int)num2 & 1) == 1) ? "奇数" : "偶数");
1
2
3
4
5
6
7
8
9
intnum1=2;
intnum2=7;
if(num1%2==0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
System.out.println((((int)num1&1)==1)?"奇数":"偶数");
System.out.println((((int)num2&1)==1)?"奇数":"偶数");
结果
4、求绝对值
int num = -9;
System.out.println(Math.abs(num));
int i = num >> 31;
System.out.println(i == 0 ? num : (~num + 1));
1
2
3
4
intnum=-9;
System.out.println(Math.abs(num));
inti=num>>31;
System.out.println(i==0?num:(~num+1));
结果
浏览量:
94
0