1.位运算符 “^” 按位异或 “&” 按位与 “|” 按位或 “~” 取反 “<<” 算术左移 “>>” 算术右移
思路: 如果一个数字n是2的整数次方,那么他的二进制形式一定是0…010…0这样的;考虑到n-1的二进制是0…001…1,这两个数求按位与的结果一定是0。因此如果n&(n-1)为0,那么这个数是2的次方。 如果这个数也是4的次方,那么二进制表示中1的位置必须为奇数位。那么我们可以把n和二进制的10101…101(即十进制下的1431655765)做按位与,如果结果不为0,那么说明这个数是4的次方。
bool isPowerOfFour(int n){ return n>0&&!(n&(n-1))&&(n&&1431655765); }思路: 可以利用动态规划和位运算快速求解。定义一个数组dp,其中dp[i]表示数字i的二进制含1的个数。对于第 i 个数字,如果它二进制的最后一位为 1,那么它含有 1 的个数 则为 dp[i-1] + 1;如果它二进制的最后一位为 0,那么它含有 1 的个数和其算术右移结果相同,即 dp[i>>1]。
vector<int> countBits(int num) { vector<int> dp(num+1, 0); for (int i = 1; i <= num; ++i) dp[i] = i & 1? dp[i-1] + 1: dp[i>>1]; // 等价于dp[i] = dp[i&(i-1)] + 1; return dp; }