我们都知道计算机里的数据都是以二进制形式存储的,所谓的位运算可以理解为直接对内存中的二进制数据进行操作,所以速度会比较快。
这边先写个二进制输出方法
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、~操作符(取反),对应二进制位取反,0变成1,1变成0
1 int num = 5; 2 printBinaryNumber(num); 3 printBinaryNumber(~num);
结果
2、&操作符(与),对应二进制位进行与操作,都为1时变成1,其他变为0
1 int num1 = 5; 2 int num2 = 6; 3 printBinaryNumber(num1); 4 printBinaryNumber(num2); 5 printBinaryNumber(num1 & num2);
结果
3、|操作符(或)对应二进制位进行或操作,都为0时变成0,其他变为1
1 int num1 = 2; 2 int num2 = 9; 3 printBinaryNumber(num1); 4 printBinaryNumber(num2); 5 printBinaryNumber(num1 | num2);
结果
4、^操作符(异或),对应二进制位相同时,该位变成0,否则变成1
1 int num1 = 3; 2 int num2 = 9; 3 printBinaryNumber(num1); 4 printBinaryNumber(num2); 5 printBinaryNumber(num1 ^ num2);
结果
5、<<操作(左移),二进制位向左移动,右边填充0
1 int num = 3; 2 printBinaryNumber(num); 3 printBinaryNumber(num << 2);
结果
6、>>操作(右移),二进制位向右移动,左边填充0
1 int num = 4; 2 printBinaryNumber(num); 3 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 );
结果
2、求2的N次方
1 //求2的16次方: 2 System.out.println(Math.pow(2, 16)); 3 System.out.println(1L << 16);
结果
3、判断奇数偶数
1 int num1 = 2; 2 int num2 = 7; 3 if(num1 % 2 == 0){ 4 System.out.println("偶数"); 5 }else{ 6 System.out.println("奇数"); 7 } 8 System.out.println((((int)num1 & 1) == 1) ? "奇数" : "偶数"); 9 System.out.println((((int)num2 & 1) == 1) ? "奇数" : "偶数");
结果
4、求绝对值
1 int num = -9; 2 System.out.println(Math.abs(num)); 3 int i = num >> 31; 4 System.out.println(i == 0 ? num : (~num + 1));
结果