
2026-06-03:统计单比特整数。用go语言,给定一个整数 n。我们把形如其二进制表示中每一位都一样(全是 0 或全是 1)的整数称为“单比特数”。
要求你统计在区间 [0, n](包含 0 和 n)内一共有多少个“单比特数”。输出这个数量即可。
0 <= n <= 1000。
输入: n = 4。
输出: 3。
解释:
范围[0, 4]内的整数对应的二进制表示为"0"、"1"、"10"、"11"和"100"。
只有0、1和3满足单比特条件。因此答案是3。
题目来自力扣3827。
以输入 n=4 为例,完整过程:
0 → 全0 → 是单比特数1 → 全1 → 是单比特数10 → 有1有0 → 不是11 → 全1 → 是单比特数100 → 有1有0 → 不是代码没有逐个遍历判断,而是用数学规律直接计算,效率更高,步骤如下:
所有合法的单比特数(全1数)有固定格式: 1位全1:1(2¹-1)、2位全1:3(2²-1)、3位全1:7(2³-1)、4位全1:15(2⁴-1)…… 再加上数字0,就是全部的单比特数。
代码中执行 n + 1,再用 bits.Len() 计算这个数的二进制有效位数:
101,有效位数为3[0,n] 内的全1单比特数,最多有多少位二进制位数 = 全1单比特数的个数,再加上数字0,就是最终总数:
代码直接返回计算出的总数,完成统计。
.
package main
import (
"fmt"
"math/bits"
)
func countMonobit(n int)int {
return bits.Len(uint(n + 1))
}
func main() {
n := 4
result := countMonobit(n)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def count_monobit(n: int) -> int:
"""
计算需要多少个单比特数(形如 2^k - 1)才能覆盖到 n
等价于计算 (n+1) 的二进制位数
"""
return (n + 1).bit_length()
def main():
n = 4
result = count_monobit(n)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <bit>
#include <climits>
// 如果编译器支持C++20,使用std::bit_width
int countMonobit(int n) {
// std::bit_width返回无符号整数类型的二进制位数
// 注意:std::bit_width(0)返回0,与bits.Len行为一致
return std::bit_width(static_cast<unsigned int>(n + 1));
}
int main() {
int n = 4;
int result = countMonobit(n);
std::cout << result << std::endl;
return0;
}

·