题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
将n与n-1想与会把n的最右边的1去掉,比如
1100&1011 = 1000
再让count++即可计算出有多少个1
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!=0){
count++;
n=(n-1)&n;
}
return count;
}
}
补充一些常用的位运算在编程中的应用:
- 清空特定位(s=s&mask)mask中要清空的位置0
- 取某数中的特定位 (s=s&mask)mask要取出到的位置1
- 使特定值取反 s^mask mask特定位为1
- 不引入第三变量交换两个数 a=a1,b=b1
a=a^b;
b=a^b;
a=a^b - 判断int类型的数是奇数还是偶数
a&1=0 偶
a&1=1 奇 - 整数的平均数(x+y)/2
x&y+((x^y)>>1) - 计算绝对值
(x^x>>31)-x>>31