2021.1.1,新年第一个博客,哈哈哈哈!!!
位运算的一些知识:
n & n-1 : 将n的二进制数中最右边的 1 设置成 0
x & (-x) : 获取二进制中最右边的 1
n & 1 = 0 : 则 n二进制 最右一位 为 0
n & 1 = 1 : 则 n 二进制 最右一位 为 1
难度简单266
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1 输出: true 解释: 20 = 1class Solution { public: bool isPowerOfTwo(int n) { if(n == 0) return false; long x = n; while(x % 2 == 0){ x /= 2; } return x == 1; } };
class Solution { public: bool isPowerOfTwo(int n) { return n>0 && (n & n-1)==0; } };
难度简单75
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011 输出:3 解释:输入的二进制串00000000000000000000000000001011 中,共有三位为 '1'。
class Solution { public: int hammingWeight(uint32_t n) { int cnt = 0; while(n!=0){ cnt++; n = n & (n-1); } return cnt; } };
逐位判断
根据 与运算 定义,设二进制数字 n ,则有:
若 n & 1 = 0n&1=0 ,则 nn 二进制 最右一位 为 00 ;
若 n & 1 = 1n&1=1 ,则 nn 二进制 最右一位 为 11 。class Solution { public: int hammingWeight(uint32_t n) { int cnt = 0; while(n!=0){ cnt +=(n & 1); n >>= 1; } return cnt; } };