认识位运算符
获取整数的二进制32位字符
1 2 3 4 5 6
| public static void print(int num) { for (byte i = 31; i >= 0; i--) { System.out.print((num & (1 << i)) == 0 ? "0" : "1"); } System.out.println(); }
|
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| byte a = 43; byte b = 120; System.out.print("a :");print(a); System.out.print("b :");print(b); System.out.print("a|b:");print(a | b); System.out.print("a&b:");print(a & b); System.out.print("a^b:");print(a ^ b); System.out.print(" ~b:");print(~b); System.out.print("135:");print(135); System.out.print("a :");print(a); System.out.print("<<3:");print(a<<3); System.out.print(">>1:");print(a>>1); System.out.print(">>>1:");print(a>>>1); System.out.println(~b); print(~b>>7);
|
|:或
有1为1
&:与
有0为0
^:亦或
无进位相加
~:非
取反
1 2 3 4
|
print(~120); print(135);
|
~120和135的字符是一样的,为什么它是-121不是135呢?
首先理解,byte 占 8位(-128-127),其中[符号位]占一位,其余数据占用
其次当一个数是负数的时候,符号位以及其左边的位置,均为1。也就是说,-121是//1111....110000111,而135是//0000.....010000111
最后,~操作可以理解成在一条直线上,从[0和-1的中间位置]反方向去找到第n个点
注意:在程序中,0算正数。后文会验证这一结论。
<<:左移
1 2
| print(43); print(43<<3);
|
>>:右移
1 2
| print(43); print(43>>1);
|
>>>:无符号右移
1 2 3
| print(43>>>1); //00010101 print(~120); //10000111 print(~120>>7); //11111111
|
正数>>> 等价 >>
常见使用
-
判断奇偶性
1
| (num & 1) == 1 ? "奇数" : "偶数"
|
-
两个数做交换
1 2 3 4 5 6 7 8 9
| a = a ^ b; b = a ^ b; a = a ^ b;
a ^= b; b ^= a; a ^= b;
|
-
取绝对值
1 2
| int b = -327 int a = (b ^ (b>>31)) - (b>>31);
|
-
判断两个数是否异号
1 2 3 4 5 6
| boolean f = ((x ^ y) < 0);
|
-
大小写转换
-
+1
-
-1
排序
排序动态展示(冒泡排序,选择排序,插入排序,归并排序,快速排序,计数排序,基数排序) - VisuAlgo
打印
1
| Arrays.stream(arr).forEach(a-> System.out.print(a + " "));
|
交换
1 2 3 4 5
| public static void swap(int[] arr, int i, int j) { int tmp = arr[j]; arr[j] = arr[i]; arr[i] = tmp; }
|
选择排序
1 2 3 4 5 6 7 8 9 10 11 12 13
| public static void selectSort(int[] arr) { if (arr == null || arr.length < 2) { return; } int N = arr.length; for (int i = 0; i < N; i++) { int minValueIndex = i; for (int j = i + 1; j < N; j++) { minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex; } swap(arr, i, minValueIndex); } }
|
冒泡排序

1 2 3 4 5 6 7 8 9 10 11 12 13
| public static void bubbleSort(int[] arr) { if (arr == null || arr.length < 2) { return; } int N = arr.length; for (int end = N - 1; end >= 0; end--) { for (int second = 1; second <= end; second++) { if (arr[second - 1] > arr[second]) { swap(arr, second - 1, second); } } } }
|
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static void insertSort1(int[] arr) { if (arr == null || arr.length < 2) { return; } int N = arr.length; for (int end = 1; end < N; end++) { int newNumIndex = end; while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) { swap(arr, newNumIndex - 1, newNumIndex); newNumIndex--; } } }
public static void insertSort2(int[] arr) { if (arr == null || arr.length < 2) { return; } int N = arr.length; for (int end = 1; end < N; end++) { for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) { swap(arr, pre, pre + 1); } } }
|
归并排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public static void mergeSort(int[] arr, int left, int right) { if (left == right) return; int mid = left + (right-left)/2; mergeSort(arr, left, mid); mergeSort(arr, mid+1, right);
merge(arr, left, mid+1, right); }
static void merge(int[] arr, int leftPtr, int rightPtr, int rightBound) { int mid = rightPtr - 1; int[] temp = new int[rightBound - leftPtr + 1];
int i = leftPtr; int j = rightPtr; int k = 0;
while(i <= mid && j <= rightBound) { temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++]; }
while(i<=mid) temp[k++] = arr[i++]; while(j<=rightBound) temp[k++] = arr[j++];
for(int m=0; m<temp.length; m++) arr[leftPtr +m] = temp[m];
}
|
快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void quickSort(int[] arr, int leftBound, int rightBound) { if(leftBound >= rightBound) return; int mid = partition(arr, leftBound, rightBound); quickSort(arr, leftBound, mid-1); quickSort(arr, mid+1, rightBound); }
static int partition(int[] arr, int leftBound, int rightBound) { { int random = leftBound + (int) (Math.random() * (rightBound - leftBound + 1)); swap(arr, random, rightBound); } int pivot = arr[rightBound]; int left = leftBound; int right = rightBound - 1; while(left <= right) { while(left <= right && arr[left] <= pivot) left ++; while(left <= right && arr[right] > pivot) right --; if(left < right) BaseCoding.swap(arr, left, right); } BaseCoding.swap(arr, left, rightBound); return left; }
|
计数排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public static void countSort(int[] arr) { if (arr == null || arr.length < 2) return; int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); } int[] bucket = new int[max + 1]; for (int i = 0; i < arr.length; i++) { bucket[arr[i]]++; } int i = 0; for (int j = 0; j < bucket.length; j++) { while (bucket[j]-- > 0) { arr[i++] = j; } } }
|
堆排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
public static void heapSort(int[] arr) { if (arr == null || arr.length < 2) return; for (int i = arr.length - 1; i >= 0; i--) { heapify(arr, i, arr.length); } int heapSize = arr.length; swap(arr, 0, --heapSize); while (heapSize > 0) { heapify(arr, 0, heapSize); swap(arr, 0, --heapSize); } }
private static void heapify(int[] arr, int index, int heapSize) { int left = (index << 1) + 1; while (left < heapSize) { int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left; largest = arr[largest] > arr[index] ? largest : index; if (largest == index) { break; } swap(arr, largest, index); index = largest; left = (index << 1) + 1; }
}
private static void heapInsert(int[] arr, int index) { while (arr[index] > arr[(index - 1) / 2]) { swap(arr, index, (index - 1) / 2); index = (index - 1) / 2; } }
|
基数排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
public static void radixSort(int[] arr) { if (arr == null || arr.length < 2) { return; } radixSort(arr, 0, arr.length - 1, maxbits(arr)); }
private static int maxbits(int[] arr) { int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { max = Math.max(max, arr[i]); } int res = 0; while (max != 0) { res++; max /= 10; } return res; }
private static void radixSort(int[] arr, int L, int R, int digit) { final int radix = 10; int i = 0, j = 0; int[] help = new int[R - L + 1]; for (int d = 1; d <= digit; d++) { int[] count = new int[radix]; for (i = L; i <= R; i++) { j = getDigit(arr[i], d); count[j]++; } for (i = 1; i < radix; i++) { count[i] = count[i] + count[i - 1]; } for (i = R; i >= L; i--) { j = getDigit(arr[i], d); help[count[j] - 1] = arr[i]; count[j]--; } for (i = L, j = 0; i <= R; i++, j++) { arr[i] = help[j]; } } }
public static int getDigit(int x, int d) { return ((x / ((int) Math.pow(10, d - 1))) % 10); }
|