今天在刷leetcode的时候,忘记了布莱恩·克尼根算法,所以回过头来复习一遍,顺手写下来。
问题是:如何得到一个二进制数中1的数量?
统计二进制中1的个数的两种方法:
本质上的位运算要对原数进行移位运算,然后每次对其进行”取模运算(i % 2)“或者” AND 操作(i & 1)“来判断每次移位运算移过来的东西是1还是0(逐位比较边缘位置是否为 1);
一、布莱恩·克尼根位计数算法
布莱恩·克尼根位计数算法的基本思想是:使用特定比特位和算术运算移除等于 1 的最右比特位。
比如要计算x:10001000 10001000的“1”个数:
x:10001000 10001000
x-1: 10001000 10000111
那么x&x-1的值为ans=10001000 10000000.
如此循环直到ans的值为0,每次count+1即可记录x中原有的1数量;
代码举例:
public class Example {
public static void main(String[] args) {
//布莱恩克尼根算法举例:
int ans = 0