法一:与操作
判断一个整数的奇偶性,只要判断其二进制的最低位是1还是0。但如果N为偶数,那么N-1的二进制形式就不单单是把最低位置为0这么简单,要涉及到借位的问题。具体看下面的例子:
数字0 :0000
数字1 :0001
数字2 :0010
数字3 :0011
数字4 :0100
数字5 :0101
数字6 :0110
N为偶数,N&(N-1)的效果就是把N的从右边数起的第一个1置为0,比如6&5,是0100,把第二位的1置为0了;N为奇数,恰巧N&(N-1)能做到把最低位的1置为0的效果。
因此,我们每做一次N&(N-1)运算,就意味着把最低位的1清除了,那么1的个数就加1。第二次运算就把第一次与运算的结果,即N = N&(N-1),再做一次N&(N-1),直到把二进制中的1全部消除为止,也就是N变成全0时,循环停止。
//计算1的个数
int count1(int n)
{
int count = 0;
while (n != 0)
{
n = n & (n - 1);
count++;
}
return count;
}
法二:移位法
判断这个数的最后以为是否为1,如果为1,那么加1