-
或运算统计
>问题: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 >思路 1.位运算中找合适的运算符号,首先我们要了解各符号的特性 2.这里我将用到|(或)的特性:两者有1就1,全0才0 3.这里简单做一下举例:比如要测1000111 我们给出如下: 0000001 相当于1<<0 0000010 相当于1<<1 0000100 相当于1<<2 0001000 相当于1<<3 0010000 相当于1<<4 0100000 相当于1<<5 1000000 相当于1<<6 4.给出的数是有规律的,可以用1<<?代替 5.我们将下面的数一一与需要数1的个数的数进行|(或)运算 6.然后判断与这个数是否与本身相等 7.因为存在两种情况: <1>.该位是1,那么1|1还是1,该数的其他位未变,比较改变后的数和要测的数是否相等,很明显相等,统计! <2>.该位是0,那么1|0还是1,该数的其他位同样未变,比较改变后的数和要测的数是否相等,很明显不相等
-
初步代码:
public static int hammingWeight(int n) {
long num1=0;
long num2=0;
int count=0;
for (int i=0;i<32;i++){
num1=(long)Math.pow(2,i);
num2=num1|n;
if (num2==n){
count++;
}
}
return count;
}
- 精简代码:
public static int hammingWeight(int n) {
int count=0;
for (int i=0;i<32;i++){
if (((1<<i)|n)==n){
count++;
}
}
return count;
}