求正整数二进制中1的个数
n&(n-1) 消除n的最右一位1,如 111 & 110 = 110(7 & 6 = 6), 1100 & 1011 = 1000(12 & 11 = 8)
leetcode 位1的个数
异或
n ^ n = 0
leetcode 只出现一次的数字
求反码(求同二进制位数的最大值)
n ^ (和n二进制位数相同的全1的数)
int temp = 1;
while n >= temp {
temp <<= 1;
}
n ^ (temp - 1)即可,
若n 为32位正整数,要考虑temp溢出问题,可以先将temp转换位64位
leetcode 十进制整数的反码
移位
leetcode 二进制表示中质数个计算置位
405. 数字转换为十六进制数
n & (-n) 只保留最后一位1