位运算常用技巧
概述
位运算指的是将数据按比特位进行操作,优势在于效率高、耗时少。有些非比特位逻辑场景也可以转变为位运算问题,从而在较低的时间复杂度下实现逻辑,比如查找出现一次的数字、最大单词长度乘积等问题。本文主要总结梳理位运算常见的逻辑技巧以及相应代码并对相关问题进行解析。
基本操作
常用逻辑
判断奇偶数
bool isEven(int n) { if((a & 1) == 0) { return true; } return false; }
位操作交换符号
int reversal(int a) { return ~a + 1; }
位1的个数
int countBit(int n) { int count = 0; while (n > 0) { n = n & (n - 1); count++; } return count; }
最高位的1
int leftBit(int n) { int bit = -1; for (int i = 31; i >= 0; i--) { int tmp = 1 << i; if (num & tmp) { bit = i + 1; break; } } return bit; }
最低位的1
int rightBit(int n) { int bit = 0; for (int i = 0; i < 32; i++) { int tmp = 1 << i; if (num & tmp) { bit = i + 1; break; } } return bit; }
有效位只有一个1
bool isOnlyOne(int n) { return (n & (n - 1)) == 0; } bool isOnlyOne(int n) { return (n & -n) == n; }
有效位全是1
bool isAllOne(int n) { return (n & (n + 1)) == 0; }
2的幂
bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; }
4的幂
bool isPowerOfFour(int n) { return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0; } bool isPowerOfFour(int n) { return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1; }