c++11 - 按位 AND 计算除以“n”的 2 的最大幂 - C++
问题描述
在阅读二进制索引树时,我遇到了以下表达式,该表达式神奇地计算出除以给定数字“n”的 2 的最大幂
n&-n
我想要一个正式的论点,为什么这个表达式正在做它所做的事情。此外,使用按位运算符有很多这样的技巧,可以节省我们很多时间并派上用场。请列出你知道的尽可能多的人。
例如, 1 << n
给出 2 的 n 次幂。
解决方案
回答我自己的问题,我无法找到一个非常复杂的解决方案,但这让我很满意
让除以n
2 k的二的最高幂。
这意味着k
在最后一个 1 之后有零(如果没有,它给出 n=0 并且 n&-n 也为零,这是正确的)。
-n = ~n+1
,因此 n 中的所有数字都被反转,除了最后一个和后面的k
零。
采用按位与将导致最后一个后跟 k 个零,即 2 k。
我发现的一些使用按位运算符的技巧是:
x | (1 << k) 将第 k 位设置为 1
x & ~(1 << k) 将第 k 位设置为零
x ^ (1 << k) 反转第 k 位
x & (x−1) 将 x 的最后一位设置为零
x &−x 将所有 1 位设置为零,除了最后一位。
当 x & (x−1) = 0 时,正数 x 正好是 2 的幂。
公式 x | (x−1) 反转最后一位之后的所有位
这些可以用类似的证明来证明。当我遇到更多时,我会添加更多。
推荐阅读
- javascript - 如何取消正在进行的http调用解析或拒绝角度组件的onDestroy
- gatsby - Gatsby Build 不会为非页面组件生成 html
- office-js - Office word web addin中的拖放操作
- node.js - Webpack 生产构建样式不出现
- php - 权限被拒绝:无法打开索引目录:/var/www/html/
- dynamics-crm - 在 Dynamics CRM 统一界面中的查找字段下隐藏或删除“更改视图”选项
- c# - 在 C# 中是否可以通过反射检查方法是否是迭代器?
- phaser-framework - Phaser 3 - 设置图形对象的锚点
- java - 如何使用 forEach() 方法通过 Java 8 迭代 AWS 预留 EC2 实例?
- react-native - React modal 元素不覆盖屏幕的左侧