Brian Kernighan 算法

2023-01-16 08:37:10 浏览数 (1)

Brian Kernighan 算法

对任何一个数 nn & ( n − 1 ) 的结果是n 的比特位最右端的 1 变为 0 的结果,可以用于清除二进制数中最右侧的 1。 例如: n = 12 Dec = 1100 Bin n - 1 = 11 Dec = 1011 Bin n & (n - 1) = 1000 Bin

n & (~n 1)提取出整数 n 最后一位为 1 的数 n = 12 Dec = 1100 Bin ~n = 0011 Bin, ~n 1 = 0100 Bin n & (~n 1) = 0100

用例 LeetCode338 比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。

代码语言:javascript复制
public int[] countBits(int n) {
	int[] arr = new int[n   1];
    for (int i = 1; i < n   1; i  ) {
    	arr[i] = countOnes(i);
    }
    return arr;
}

private int countOnes(int num) {
	int ones = 0;
	while (num > 0) {
		num &= (num - 1);
		ones  ;
	}
	return ones;
}

0 人点赞