1. 手写位运算,判断 2 的幂、统计 1 的个数(Brian Kernighan)、交换两数如何实现?
请手写位运算实现:判断一个数是否为 2 的幂、统计二进制中 1 的个数(Brian Kernighan 算法)、以及不使用临时变量交换两数?
- 掌握 x & (x-1) 判断 2 的幂
- 掌握 Brian Kernighan 统计 1 的个数
- 掌握异或交换两数及其局限
判断 2 的幂:2 的幂只有最高位为 1,其余为 0,故 n>0 且 n & (n-1) == 0。统计 1 的个数用 Brian Kernighan:每次 n &= (n-1) 会去掉最低位的 1,循环次数即为 1 的个数,复杂度 O(位数中 1 的个数)。交换两数用异或:a ^= b; b ^= a; a ^= b,三条异或即可交换,无需临时变量。局限:异或交换要求两变量地址不同(同一变量会置零),且对同一变量交换会出错,实际生产建议用临时变量或 std::swap。
核心技巧是 x & (x-1) 能清除最低位 1,是判断 2 的幂与统计 1 个数的共同基础。异或交换利用了异或的自反性(a^b^b=a)。这些是位运算的经典基础题,需理解原理而非死记。