1.求变量val中1的个数:
方法1:逐个去比较
int getNum1(int val){
int num = 0;
while (val){
num += val & 0x01;
val = val >> 1;
}
return num;
}
方法2:使用x & x - 1
int getNum2(int val){
int num = 0;
while (val){
val &= (val - 1);
num ++;
}
return num;
}
2.判断一个数是不是2的整数次幂运算
只要一个数是2的整数次幂,那么肯定只有一个1,而且在头。都是形如0..0100...000这样形式的:
BOOL is2Power(int val){
return !(val & val - 1);
}
3.判断一个数是不是4的整数次幂
方法1:
a.这个数是2的整数次幂b.并且个位是4或者6:
条件a好理解,条件b这样理解:
2^2 = 4; (y)
2^3 = 8; (n)
2^4 = 16;(y)
2^5 = 32;(n)
2^6 = 64;(y)
可以看出,在只要个位数字是4,或者6,就是4的整数次幂
所以:
BOOL is2Power(int val){
return !(val&(val-1)) && (val%10 == 4 || val%10 == 6);
}
方法2:
4的整数次幂,形如100,10000,1000000....
可以看出,只要是0的个数都是偶数,且只有1个1。那么,判断0的个数是否是偶数的程序:
BOOL is4Power2(int val){
int num = 0;
while (val){
if ((val-1) & 0x01){
num ++;
}
val = val >> 1;
}
printf("the number of 0 is %d\n",num);
if (!(num % 2)){
return true;
}
else
return false;
}
如此,就可以判断一个数的0是不是偶数。如果是的话,再去判断这个数是不是只有1个1(排出想1100这样的数字)