lowbit

lowbit 函数

定义

lowbit(n) 定义为非负整数 n 在二进制表示下最低位的 1 所对应的值。

任一非负整数都可被表示一个二进制数:

(5)10=(101)2

(6)10=(110)2

而 lowbit 是这样的,设一个非负整数 n 在二进制表示下最低位的 1 为从左往右数第 k 位,lowbit(n)=2k1

例如:

lowbit(5)=(1)2=(1)10

kowbit(6)=(10)2=(2)10

实现

lowbit(n)=n&(-n)

n 为非负整数,二进制下第 k 位为 1,第 1k1 位为 0
(14)10=(01110)2 来举例:

先将 14 取反,取反后为 (10001)2,再加 1,变为 (10010)2。这时候与原来相比,只有第 12 位相同,其他相反,再相与,最终得到的就是 lowbit(n)

而在补码表示下 ~n=-1-n,即 -n=~n+1,所以 lowbit(n)=n&(-n)

应用

统计 1 的个数

一直进行 lowbit,不断减去直到为 0

while(x)
{
    x-=x&-x;
    cnt++;
}

找出所有为 1 的位

lowbit 配合 hash,即可做到找出所有为 1 的位。

const int N=1<<20;
int H[N+5];
for(int i=0;i<=20;i++) H[1<<i]=i;//代替 log 运算
while(x)
{
    cout<<H[x&-x]<<" ";
    x-=x&-x;
}
posted @   zhouruoheng  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示