C++二进制数移位需求:简化指定累加循环代码实现
二进制连续1的生成方法
要从数字1(二进制00000001)得到00001111这类连续全1的二进制数,直接用位运算即可实现:
- 核心公式:
(1 << n) - 1,其中n是你需要的连续1的位数 - 对应你的需求:想要得到4位连续1(
00001111),代入n=4计算得(1 << 4) - 1 = 15,二进制正好是00001111 - 代码示例:
int target = (1 << 4) - 1; // 结果为15,二进制00001111
原理:1 << n会生成仅第n位为1的二进制数(比如1<<4是10000),减1后该位变为0,同时所有低位自动变为1(10000-1=01111),刚好得到n位连续的1。
循环代码简化
你提供的循环:
for(int i=1;h>0;h--,i*=2) hr+=i;
这段代码本质是计算**2^0 + 2^1 + ... + 2^(h-1)**的和并累加到hr中,而这个求和结果等价于2^h - 1,因此可以直接简化为一行位运算代码:
hr += (1 << h) - 1;
既去掉了循环提升效率,也大幅简化了代码逻辑。
内容的提问来源于stack exchange,提问作者Jasom Freckenberg
相关产品推荐
相关产品推荐

