基础知识:
(1)与,或,异或运算
与& 0&0=0 0&1=1 1&0=0 1&1=1
或| |两边有一个1结果就是1
异或^ ^两边若都是0或者都是1则结果是0,否则是1
(2)左移,右移运算符
m<<n表示 把m左移n位 左移不需考虑n正负,只需右补0,左丢弃
m>>n表示 把m右移n位。右移要考虑n正负。若n是有符号数(左补符号位,负数补1 正数补0),右丢弃
例题
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法一
class Solution {
public:
int NumberOf1(int n) {
unsigned int cur=1;
int Num=0;
while(cur)
{
if(n&cur)
++Num;
cur=cur<<1;
}
return Num;
}
};
分析,上面方法是通过左移cur逐位与n与,不能右移n,逐位与1与,因为若n是负数,右移n将导致n最后变成0xFFFFFFFF,程序死循环
方法二
思想:把一个整数减去1,再和原整数与,相当于该整数最右边的1变成0
int NumberOf1(int n)
{
int count = 0;
while (n)
{
++count;
n = (n - 1)&n;
}
return count;
}