第13章 位运算
- 格式:ppt
- 大小:168.00 KB
- 文档页数:19


⼏种常见的位运算1、判断奇偶数如果把⼀个数n以⼆进制数的形式表⽰的话,我们只需要判断最后⼀个⼆进制位是1还是0即可。
如果是1,则代表奇数,否则为偶数。
代码如下:if(n & 1 == 1){// n是奇数}2、交换两个数x = x ^ y; // (1)y = x ^ y; // (2)x = x ^ y; // (3)我们都知道两个相同的数异或之后的结果为0,即 n ^ n = 0,并且任何数与0异或之后等于它本⾝,即 n ^ 0 = n。
于是我们把(1)中的x代⼊(2)中的x,有:y = x ^ y = (x ^ y) ^ y = x ^ ( y ^ y) = x ^ 0 = x,这样x的值就赋给了y。
对于(3),推导如下:x = x ^ y = (x ^ y) ^ x = (x ^ x) ^ y = 0 ^ y = y,这样y的值就赋给了x。
异或运算⽀持运算的交换律和结合律。
3、找出没有重复的数给你⼀组整型数据,这些数据中,其中有⼀个数只出现了⼀次,其他的数都出现了两次,让你来找出⼀个数这道题可能很多⼈会⽤⼀个哈希表来存储,每次存储的时候,记录下某个数出现的次数,最后遍历哈希表找出只出现了⼀次的次数。
这种⽅式的时间复杂度是O(n),空间复杂度也为O(n)了。
其实这道题也可以进⾏位运算,,我们可以把这⼀组整型数全都异或,由于两个相同的数异或的结果为0,⼀个数与0异或的结果为其⾃⾝,所以异或的所得到的结果就为只出现了⼀次的数。
例如这组数据是:1, 2, 3, 4, 5, 1, 2, 3, 4。
其中 5 只出现了⼀次,其他都出现了两次,把他们全部异或⼀下,结果如下:1 ^2 ^3 ^4 ^5 ^ 1 ^ 2 ^ 3 ^ 4 = (1 ^ 1) ^ (2 ^ 2) ^ (3 ^ 3) ^ (4 ^ 4) ^ 5 = 0 ^ 0 ^ 0 ^ 0 ^ 5 = 5代码如下:int find(int[] nums){int tmp = nums[0];for(int i = 1;i < nums.length; i++)tmp ^= arr[i];return tmp;}4、2的n次⽅求解 2 的 n 次⽅,并且不能使⽤系统⾃带的 pow 函数很多⼈看到这个题可能觉得让n个2相乘就⾏了,如果这么做的话,时间复杂度为O(n)了。