一、需求
编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中
设置位的个数(也被称为汉明重量)。
示例 1:
输入:n = 11
输出:3
解释:输入的二进制串 1011 中,共有 3 个设置位。
示例 2:
输入:n = 128
输出:1
解释:输入的二进制串 10000000 中,共有 1 个设置位。
示例 3:
输入:n = 2147483645
输出:30
解释:输入的二进制串 11111111111111111111111111111101 中,共有 30 个设置位。
提示:
1 <= n <= 2^31 - 1
进阶:
如果多次调用这个函数,你将如何优化你的算法?
二、思路分析图
(一)循环检查二进制位
三、代码
(一)数据初始化
/*** 入口* 191、位1的个数* 输入:* nums = 11(1101)* 输出:(1的个数)* result1 = 3* 解释:* 1.循环检查二进制位* 2.位运算优化* 3.循环检查二进制位调优*/
@Test
public void suanfa43()
{// 初始化int num = 11;int index = getHammingWeight(num);System.out.println("循环检查二进制位 = " + index);int index1 = getHammingWeightOne(num);System.out.println("位运算优化 = " + index1);int index2 = getHammingWeightTow(num);System.out.println("循环检查二进制位调优 = " + index2);
}
(二)循环检查二进制位【自己写的方案】
/*** 循环检查二进制位** @param n* @return*/
private int getHammingWeight(int n)
{int index = 0;while (n != 0){if (n % 2 == 1){index++;}n /= 2;}return index;
}
(三)位运算优化
/*** 位运算优化** @param n* @return*/
private int getHammingWeightOne(int n)
{int ret = 0;while (n != 0) {n &= n - 1;ret++;}return ret;
}
(四)循环检查二进制位调优
/*** 循环检查二进制位调优** @param n* @return*/
private int getHammingWeightTow(int n)
{int index = 0;while (n != 0){index += n % 2;n /= 2;}return index;
}
(五) 结果图
作者:王子威
四、总结
- 学习了位1的个数算法
- 主要采用二进制计算逻辑
- 调优发现没必要判断,所有的模加起来也是一样的
- 算法兴趣+1 总:41
- 加强了对算法的分析能力