如何获取十进制数的第n位二进制位?求C++高效实现方案
获取十进制数的第n位二进制位(C++实现)
你的思路完全可行且高效
你的思路是对的,位与(bitwise &)运算是获取指定二进制位最直接高效的方式——位运算属于CPU原生指令,几乎没有额外开销,比算术运算或循环判断的执行速度快得多。
如何生成仅目标位为1的掩码数
要生成仅第n位为1的数(俗称"掩码"),只需将1左移n位即可,对应的C++代码为:1 << n。需要注意以下细节:
- 若处理32位整数,
1默认是int类型(通常为32位),当n超过31时会触发未定义行为; - 若处理64位整数,建议用
1LL << n(LL表示长整型)或明确指定无符号类型,比如static_cast<uint64_t>(1) << n,避免溢出问题。
完整代码实现
下面是一个可直接使用的函数,输入十进制数和目标位n,返回该位的值(0或1):
#include <cstdint> // 用于固定宽度整数类型,如uint32_t、uint64_t // 获取num的第n位二进制位(从末尾开始计数,起始为0) int getNthBit(uint64_t num, int n) { // 生成掩码:仅第n位为1 uint64_t mask = static_cast<uint64_t>(1) << n; // 位与运算,结果非0则该位为1,否则为0 return (num & mask) != 0 ? 1 : 0; }
测试示例
对应你给出的例子:
- 对于十进制7(二进制
111),调用getNthBit(7, 0),掩码为1<<0=1(二进制001),7 & 1 = 1,返回1; - 对于十进制9(二进制
1001),调用getNthBit(9, 2),掩码为1<<2=4(二进制100),9 & 4 = 0,返回0。
注意事项
- 如果n的取值超过当前整数类型的位数(比如给uint32_t传n=32),左移操作会触发未定义行为,建议在函数中添加边界判断,比如
if (n >= 64) return 0;(针对uint64_t); - 使用无符号整数类型可避免符号位带来的意外问题,比如负数的二进制补码处理。
内容的提问来源于stack exchange,提问作者Math Student
相关产品推荐
相关产品推荐

