位运算( 位运算baike)
1 2 3 | if(a&1 == 1){ //偶数 } |
1 2 3 4 5 6 7 8 | //常规 x = x^y y = x^y x = x^y //简写 x ^= y y ^= x x ^= y |
1 2 3 4 5 6 7 8 9 | int find(int[] arr) { int tmp = arr[0]; for(int i=1;i<arr.length;i++) { tmp ^= arr[i]; } return tmp; } |
https://leetcode-cn.com/problems/sum-of-two-integers
这个地方要了解加法器是如何运行的
另外一个重点是负数在内存里面存储是补码 (https://blog.csdn.net/zl10086111/article/details/80907428)
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 | int getSum(int a, int b) { while (b != 0) { unsigned x = a ^ b; unsigned y = (unsigned)(a & b) << 1; a = x; b = y; } return a; } /* 整数按照加法器来搞 5 + 3 0101 0011 x= 5^3 = 0110 y= 5&3 = 0001 x^ (y<<1) = 0110 0010 = 0100 x& (y<<1) 0110 0010 = 0010 x = 0100 y = 0010 x^ (y<<1) = 0100 0100 = 0000 x& (y<<1) 0100 0100 = 0100 x = 0000 y = 0100 x = 0000 ^ 1000 = 1000 y = 0000 & 1000 = 0 */ |
其他请参考:位运算装逼指南 https://blog.csdn.net/Mrchai521/article/details/90318128