计算二进制整数位数的方法可分为以下两种:
一、通过位运算计算位数
通过不断将数字右移1位,统计移位次数直到数字为0。每次右移相当于去掉二进制末尾的1位,移位次数即为位数。 ```java
int count = 0;
int n = num;
while (n > 0) {
n >>= 1;
count++;
}
return count;
```
或使用位与运算优化:
```java
int count = 0;
while (num > 0) {
count += num & 1;
num >>= 1;
}
return count;
```
按位与减一法
通过`num & (num - 1)`操作,每次消除二进制末尾的1位,直到`num`为0,计数器记录消除次数。 ```java
int count = 0;
while (num > 0) {
num &= (num - 1);
count++;
}
return count;
```
二、通过数学方法计算位数
动态规划法
利用数位规律,偶数位与`num/2`位数相同,奇数位比`num/2`位数多1。通过动态规划数组记录结果。 ```java
int[] dp = new int[num + 1];
dp = 0;
for (int i = 1; i <= num; i++) {
dp[i] = dp[i >> 1] + (i & 1);
}
return dp[num];
```
数学公式法
通过递推公式`dp[i] = dp[i >> 1] + (i & 1)`计算,其中`i >> 1`表示右移1位,`i & 1`判断最低位是否为1。
总结
效率优先: 位运算方法(右移/按位与)时间复杂度为O(log n),适合大多数场景。- 数学优化