在計算機中所有數據都是以二進制的形式儲存的。
位運算其實就是直接對在內存中的二進制數據進行操作,因此處理數據的速度非常快。
方便演示,首先寫個二進制打印方法:
private static void printNum(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
int num = 3; printNum(num); printNum(~num);
結果如下:
00000000000000000000000000000011
11111111111111111111111111111100
2、&操作符(與),對應二進制位進行與操作,都為1時變成1,其他變為0
int num1 = 3; int num2 = 7; printNum(num1); printNum(num2); printNum(num1 & num2);
結果如下:
00000000000000000000000000000011
00000000000000000000000000000111
00000000000000000000000000000011
3、|操作符(或)對應二進制位進行或操作,都為0時變成0,其他變為1
int num1 = 4; int num2 = 7; printNum(num1); printNum(num2); printNum(num1 | num2);
結果如下:
00000000000000000000000000000100
00000000000000000000000000000111
00000000000000000000000000000111
4、^操作符(異或),對應二進制位相同時,該位變成0,否則變成1
int num1 = 5; int num2 = 9; printNum(num1); printNum(num2); printNum(num1 ^ num2);
結果如下:
00000000000000000000000000000101
00000000000000000000000000001001
00000000000000000000000000001100
5、<<操作(左移),二進制位向左移動,右邊填充0
int num1 = 5; printNum(num1); printNum(num1 << 2);
結果如下:
00000000000000000000000000000101
00000000000000000000000000010100
6、>>操作(右移),二進制位向右移動,左邊填充0
int num1 = 5; printNum(num1); printNum(num1 >> 2);
結果如下:
00000000000000000000000000000101
00000000000000000000000000000001
位操作常見應用
1、不使用中間變量交換兩個數
int num1 = 2; int num2 = 5; num1 = num1^num2; num2 = num2^num1; num1 = num1^num2; System.out.println("num1:" + num1 +"\n"+ "num2:" + num2 );
2、求2的N次方
//求2的32次方: System.out.println(Math.pow(2, 32)); System.out.println(1L<<32);
3、判斷奇數偶數
int num1 = 4; int num2 = 9; 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 = -3; System.out.println(Math.abs(num)); int i = num >> 31; System.out.println(i == 0 ? num : (~num + 1));