191. Number of 1 Bits

本文介绍了一种在Java中计算整数Hamming权重的方法,即计算无符号整数二进制表示中1的个数。文章详细解释了位操作和位移运算,并给出了一段清晰的示例代码。


Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.

题目大意 输入一个无符号数,判断其二进制表示里有多少个1。

有一篇解析很好,摘录如下:

public static int hammingWeight(int n) {
	int ones = 0;
    	while(n!=0) {
    		ones = ones + (n & 1);
    		n = n>>>1;
    	}
    	return ones;
}
  • An Integer in Java has 32 bits, e.g. 00101000011110010100001000011010.
  • To count the 1s in the Integer representation we put the input int
    n in bit AND with 1 (that is represented as
    00000000000000000000000000000001, and if this operation result is 1,
    that means that the last bit of the input integer is 1. Thus we add it to the 1s count.

ones = ones + (n & 1);

  • Then we shift the input Integer by one on the right, to check for the
    next bit.

n = n>>>1;

We need to use bit shifting unsigned operation >>> (while >> depends on sign extension)

  • We keep doing this until the input Integer is 0.

In Java we need to put attention on the fact that the maximum integer is 2147483647. Integer type in Java is signed and there is no unsigned int. So the input 2147483648 is represented in Java as -2147483648 (in java int type has a cyclic representation, that means Integer.MAX_VALUE+1==Integer.MIN_VALUE).

翻译:

在java中我们需要注意的一点是整数能表示最大的数是2147483647,另外整数在java中是有符号的而且不存在无符号的整数,所以,如果程序输入的是2147483648 ,那么由于java能表示的最大整数为2147483647,输入的2147483648 在java中表示的数值为-2147483648,补码表示即为1后面跟31个0。

java中数字是循环表示的,所以最大的正数加一为最小的负数。


This force us to use

n!=0

in the while condition and we cannot use

n>0

because the input 2147483648 would correspond to -2147483648 in java and the code would not enter the while if the condition is n>0 for n=2147483648.

另附解析一篇:

https://zhuanlan.zhihu.com/p/29187389


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值