← 返回编程题库
coding-power-of-two-bit-check简单免费版2000ms未尝试

2 的幂位运算判定

Power-of-Two Bit Check

开始编码

2 的幂是形如 2^kk 为非负整数)的正整数:1, 2, 4, 8, 16, 32, ...。这些数在二进制下只有一位为 1:1 = 0b12 = 0b104 = 0b1008 = 0b1000……教科书位技巧是

is_power_of_two(n) := (n > 0) AND (n & (n - 1)) == 0

直观解释:2 的幂减 1 后,那唯一的置位翻成 0,下面所有位翻成 1,与原数按位与就把唯一的共同位也抹掉,结果为 0。任何拥有两个或以上置位的数,至少最高置位会在减 1 后存活,AND 结果非零。

请实现 solution(nums)nums 是整数列表(可能为空,可能包含 0 或负数)。返回等长的布尔列表,第 i 个元素当且仅当 nums[i] 是 2 的幂时为 True

评测会盯紧两个陷阱:(1) 0 不是 2 的幂——0 & -1 == 0,没有 n > 0 守卫的话裸位技巧会撒谎;(2) 负数按定义不是 2 的幂——-4 不是任何 k ≥ 0 对应的 2^k,所以无论 Python 任意精度下 n & (n-1) 算成什么,都必须返回 False

Examples

solution([1, 2, 3, 4, 8, 16, 1024]) 返回 [True, True, False, True, True, True, True]1 = 2^02 = 2^14 = 2^28 = 2^316 = 2^41024 = 2^10,全是 2 的幂。3 = 0b11 有两位置位,3 & 2 = 2 != 0 → False。

solution([0, -1, -2, -4]) 返回 [False, False, False, False]。0 被 n > 0 守卫拦掉。负数按定义不是 2 的幂(2 的幂严格为正)。

solution([]) 返回 []。空输入 → 空输出,不抛异常。

签名见 stubs/stub.py

Practical context

n & (n-1) == 0 这个技巧在系统代码里到处出现,凡是大小、对齐、容量被限定为 2 的幂的地方都会用到。哈希表桶数通常取 2 的幂,于是「哈希值落到哪个桶」可以写成 hash & (capacity - 1) 而不是 hash % capacity——同一个 n - 1 掩码当成快速取模。内存分配器 (jemalloc, tcmalloc) 要求对齐为 2 的幂,会先用这个判定校验请求,再用 (addr + align - 1) & ~(align - 1) 上取整。无锁环形缓冲(低延迟行情系统里的 SPSC 队列)容量必须是 2 的幂,下标回卷写成 (head + 1) & (capacity - 1) 而不是 == capacity 的分支。在交易系统里,订单簿 L2 环形缓冲、撮合引擎事件日志、FIX 会话的滑动序号窗口都按这个尺寸来;配置时一句 assert is_power_of_two(capacity) 就能在系统上线前抓住误配置,避免错位掩码静悄悄地把 head/tail 指针带偏。

约束条件

  • 0 ≤ len(nums) ≤ 10^5
  • -10^9 ≤ nums[i] ≤ 10^9
  • 负数与 0 不是 2 的幂——返回 False
  • 1 = 2^0 是 2 的幂——返回 True

样例

Case 1 · canonical statement example — small powers and a non-power

输入: [[1,2,3,4,8,16,1024]]

期望: [true,true,false,true,true,true,true]

1=2^0, 2=2^1, 4=2^2, 8=2^3, 16=2^4, 1024=2^10 都是 2 的幂。3=0b11 有两位置位,3&2=2!=0 → False。

Case 2 · empty list — empty output, no exception

输入: [[]]

期望: []

空输入对应空输出。

Case 3 · zero and negatives — all False (n>0 guard pinned)

输入: [[0,-1,-2,-4]]

期望: [false,false,false,false]

0 被 n>0 守卫拦掉;负数按定义不是 2 的幂(2 的幂严格为正)。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · canonical statement example — small powers and a non-power

输入: [[1,2,3,4,8,16,1024]]

期望: [true,true,false,true,true,true,true]

1=2^0, 2=2^1, 4=2^2, 8=2^3, 16=2^4, 1024=2^10 都是 2 的幂。3=0b11 有两位置位,3&2=2!=0 → False。

Case 2 · empty list — empty output, no exception

输入: [[]]

期望: []

空输入对应空输出。

Case 3 · zero and negatives — all False (n>0 guard pinned)

输入: [[0,-1,-2,-4]]

期望: [false,false,false,false]

0 被 n>0 守卫拦掉;负数按定义不是 2 的幂(2 的幂严格为正)。