专题五:位运算~
位运算总结
- 基础位运算:>>、<<、~、&、|和^六个运算
- 给一个数n,确定它的二进制表示中的第x位是0还是1:(n >> x) & 1
- 将一个数n的二进制表示的第x位修改成1:n |= (1 << x)
- 将一个数n的二进制表示的第x位修改成0:n &=(~(1 << x))
- 提取一个数n二进制表示中最右端的1:n & (-n)
- 干掉一个数n二进制表示中最右端的1:n & (n - 1)
- 异或运算律:a ^ 0 = a 、a ^ a = 0、a ^ b ^c = a ^ (b ^ c)
一、位1的个数
链接: 191. 位1的个数
public int hammingWeight(int n) {int ret = 0;while (n != 0) {n &= (n - 1);ret++;}return ret;}
二、比特位计数
链接: 338. 比特位计数
public int[] countBits(int n) {int[] bites = new int[n + 1];for (int i= 0; i <= n; i++) {bites[i] = countOnes(i);}return bites;}public int countOnes(int x) {int ones = 0;while (x != 0) {x &= (x - 1);ones++;}return ones;}
三、汉明距离
链接: 461. 汉明距离
public int hammingDistance(int x, int y) {int s = x ^ y, ret = 0;while (s != 0) {s &= s - 1;ret++;}return ret;}
四、只出现一次的数字
链接: 136. 只出现一次的数字
public int singleNumber(int[] nums) {int ret = 0;for (int x : nums) {ret ^= x;}return ret;}
五、只出现一次的数字 III
链接: 260. 只出现一次的数字 III
public int[] singleNumber(int[] nums) {int ret = 0;int[] arr = new int[2];for (int x : nums) ret ^=x;int lsb = ret & (-ret);int type1 = 0, type2 = 0;for (int num : nums) {if ((num & lsb) != 0) {type1 ^= num;} else {type2 ^= num;}}return new int[]{type1, type2};}
六、4的幂
链接: 342. 4的幂
public boolean isPowerOfFour(int n) {return (n > 0) && (n & (n - 1)) == 0 && (n % 3) == 1;}
本期内容到此为止,喜欢的话请点个赞,谢谢观看!!!