lowbit原理浅解

45 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

lowbit

定义lowbit(n)lowbit(n)定义非负整数nn在二进制表示下“最后一个11及其后面所有的00”。

例如:10=(1010)210=(1010)_2,则lowbit(10)=(10)2=2lowbit(10)=(10)_2=2

原理: 假设nn的第kk位是11,第00 ~ k1k-1位都是00

先把nn取反,则变成第kk位是00,第00 ~ k1k-1位都是11

+1+1,因为进位,后面的11都变成00,第kk位变成11,前面不变。

与之前的nn做与运算,就只剩下第kk位是11了,即为lowbit(n)lowbit(n)

所以lowbit(n)=n&(n+1)lowbit(n)=n\&(\sim n+1)

又因为补码表示下n=1n\sim n = -1-n ,所以lowbit(n)=n&nlowbit(n)=n\&-n

所以实现起来特别简单而又高效:

int lowbit(int n)
{
    return n & -n;
}

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:letmefly.blog.csdn.net/article/det…