位运算的技巧
1 package com.aixuexi.contact; 2 3 public class Helloworld { 4 public static void main(String[] args) { 5 System.out.println("helloworld"); 6 System.out.println("helloworld"); 7 System.out.println("helloworld"); 8 System.out.println("helloworld"); 9 10 //位运算的技巧 11 12 //1 、判断奇数 13 System.out.println("=====判断奇数======"); 14 int n = 13; 15 if (n % 2 == 1) { // 奇数 16 System.out.println("是个奇数:" + n); 17 } 18 if ((n & 1) == 1) { 19 System.out.println("是个奇数:" + n); 20 } 21 /* 22 * 把n用二进制转换的话,只需要判断二级制的最后一位是0 or 1 23 * 24 */ 25 26 //2、交换两个数 27 28 //low 29 System.out.println("====交换两个数====="); 30 int x = 1, y =2; 31 int temp = x; 32 x = y; 33 y = temp; 34 System.out.println(x); 35 System.out.println(y); 36 37 //高级方法 38 System.out.println("====高级方法===="); 39 x = x ^ y; 40 y = x ^ y; 41 x = x ^ y; 42 System.out.println(x); 43 System.out.println(y); 44 45 46 // 3、 找出没有重复的数 47 System.out.println("==找出没有重复的数=="); 48 /*数组中只有一个数出现一次,剩余数都出现两次,找出出现一次的数*/ 49 int[] arr = new int[] {1,2,3,4,5,1,2,3,4}; 50 System.out.println(find(arr)); 51 /* 52 * 就限于两个数相同 ^ 等于1 53 * ^ 支持交换和结合 所以 1^2^3^4^5^1^2^3^4 = (1^1)^(2^2)^(3^3)^(4^4)^5 54 */ 55 56 // 4、m 的 n 次方 57 System.out.println("==m 的 n 次方 M1 =="); 58 System.out.println(pow1(3)); 59 60 System.out.println("==m 的 n 次方 M2 =="); 61 System.out.println(pow2(3)); 62 63 // 5、找出不大于N的最大的2的幂指数 64 /*传统方法*/ 65 System.out.println("==找出不大于N的最大的2的幂指数 =="); 66 System.out.println(findN(6)); 67 68 System.out.println(findN2(6)); 69 } 70 71 72 73 //找出没有重复的数 74 public static int find(int[] arr) { 75 int tmp = arr[0]; 76 for (int i = 1; i < arr.length; i++) { 77 tmp = tmp ^ arr[i]; 78 } 79 return tmp; 80 } 81 82 //m 的 n 次方 M1 -- low 83 public static int pow1(int n) { 84 int tmp = 1; 85 for(int i = 1; i <= n; i++) { 86 tmp = tmp * 2; // m = 2 87 } 88 return tmp; 89 } 90 //m 的 n 次方 M2 91 public static int pow2(int n) { 92 int sum = 1; 93 int tmp = 2; // m = 2 94 while(n != 0) { 95 if((n & 1) == 1) { 96 sum *= tmp; 97 } 98 tmp *= tmp; 99 n = n >> 1; 100 } 101 return sum; 102 } 103 //找出不大于N的最大的2的幂指数 104 public static int findN(int n) { 105 int sum = 1; 106 while(true) { 107 if(sum * 2 > n) { 108 return sum; 109 } 110 sum *= 2; 111 } 112 } 113 114 public static int findN2(int n) { 115 n |= n >> 1; 116 n |= n >> 2; 117 n |= n >> 4; 118 n |= n >> 8; 119 n |= n >> 16; 120 121 return (n + 1) >> 1; 122 } 123 }