要判断一个整数的二进制表示中有多少位为1,可以使用位操作来高效实现。以下是具体方法和代码示例:
一、核心方法:`x & (x - 1)`
原理 :`x & (x - 1)` 可以将整数 `x` 的二进制表示中最右边的 `1` 变为 `0`。例如: - `5` 的二进制是 `101`,`5 - 1 = 4`(二进制 `100`),`5 & 4 = 4`(二进制 `100`);
- `7` 的二进制是 `111`,`7 - 1 = 6`(二进制 `110`),`7 & 6 = 6`(二进制 `110`)。
步骤
- 初始化计数器 `count` 为 `0`;
- 当 `x` 不为 `0` 时,执行 `x = x & (x - 1)` 并将 `count` 加 `1`;
- 当 `x` 为 `0` 时,结束循环,`count` 即为二进制中 `1` 的个数。
二、代码示例
以下是使用 C、Java 和 C++ 实现的代码示例:
C 语言实现
```c
include
int countones(unsigned int x) {
int count = 0;
while (x) {
x = x & (x - 1);
count++;
}
return count;
}
int main() {
unsigned int num = 29; // 二进制 11101
printf("Number of 1s in binary: %dn", countones(num));
return 0;
}
```
Java 实现
```java
public class Countones {
public static int countones(int x) {
int count = 0;
while (x != 0) {
x = x & (x - 1);
count++;
}
return count;
}
public static void main(String[] args) {
int num = 29; // 二进制 11101
System.out.println("Number of 1s in binary: " + countones(num));
}
}
```
C++ 实现
```cpp
include
int countones(unsigned int x) {
int count = 0;
while (x) {
x = x & (x - 1);
count++;
}
return count;
}
int main() {
unsigned int num = 29; // 二进制 11101
std::cout << "Number of 1s in binary: " << countones(num) << std::endl;
return 0;
}
```
三、时间复杂度分析
该算法的时间复杂度为 O(k)
,其中 `k` 是二进制表示中 `1` 的个数。因为每次循环都会将最右边的 `1` 变为 `0`,最多需要执行 `k` 次操作。
四、其他方法补充
位运算方法: 通过不断右移并使用 `&` 运算判断最低位是否为 `1`,但效率较低,时间复杂度为 O(32)
查表法:
预计算0-255每个数的二进制中1的个数,通过查表获取结果,适用于固定范围的数据。
五、示例说明
以 `29`(二进制 `11101`)为例:
第一次循环:`29 & 28 = 28`(最低位为1),`count = 1`;
第二次循环:`28 & 27 = 24`,`count = 2`;
第三次循环:`24 & 23 = 20`,`count = 3`;
依此类推,直到 `x = 0`,最终 `count = 4`。
通过上述方法,可以高效地统计整数二进制中 `1` 的个数。