【算法】快速求出 n 最低位的 1

Leetcode 2438. 二的幂数组中查询范围内的乘积

先展示算法具体实现

while (n) {
    int lowbit = n & (-n);
    powers.push_back(lowbit);
    n ^= lowbit;
}

这段代码的核心是通过 n & (-n) 计算出 n最低位的 1(即最右边的 1)

  • -nn二进制补码表示。对于任意整数 n-n 等于 ~n + 1,也就是对 n 取反然后加 1。
  • n & (-n) 的效果是提取 n 中最右边的 1 对应的那个值。例如,如果 n12(二进制是 1100),那么 -n4(二进制是 0100),n & (-n) 就是 4,即 n 中最低的 1 代表的值。

第四行:n ^= lowbit 则是通过异或运算(^)将 n 中的最低位的 1 清除掉,以继续统计后续的高位的 1 。

看题解的时候发现方法非常巧妙,由此记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值