lowbit 与 highbit
lowbit
lowbit
在竞赛中还是很常见的,比如树状数组就必须要用 lowbit
。
lowbit
的原理是利用原码, 反码, 补码的性质来获得数字在二进制下最低位的 lowbit
了。
lowbit
代码如下:
inline int lowbit(int x) {
return x & -x;
}
以一个例子来理解上面的代码(假设你已经理解了原码,反码,补码):
- 我们假设
。 的二进制为 : 。 - 对
取反的二进制为: 。 - 再对取反
加一(补码)的二进制为: 。 - 进行与操作之后:
。
就得到了我们的
highbit
这个相对来说要少见些。
顾名思义,它干的事与 lowbit
相反,求的是数字在二进制下最高位的
其原理是将一个数二进制下最高位的
int highbit(int x){
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x - (x >> 1);
}
为什么这样写呢?
我们假设 highbit
函数的第一行,我们通过右移 x - (x >> 1)
就可以得到我们想要的 highbit
了。
推广一下,如果最高位右面还有
上面的函数返回值是 int
型的,如果用别的类型,可以自行调整右移位数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理