lowbit原理浅解

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lowbit原理浅解相关的知识,希望对你有一定的参考价值。

lowbit

定义 l o w b i t ( n ) lowbit(n) lowbit(n)定义非负整数 n n n在二进制表示下“最后一个 1 1 1及其后面所有的 0 0 0”。

例如: 10 = ( 1010 ) 2 10=(1010)_2 10=(1010)2,则 l o w b i t ( 10 ) = ( 10 ) 2 = 2 lowbit(10)=(10)_2=2 lowbit(10)=(10)2=2

原理
假设 n n n的第 k k k位是 1 1 1,第 0 0 0 ~ k − 1 k-1 k1位都是 0 0 0

先把 n n n取反,则变成第 k k k位是 0 0 0,第 0 0 0 ~ k − 1 k-1 k1位都是 1 1 1

+ 1 +1 +1,因为进位,后面的 1 1 1都变成 0 0 0,第 k k k位变成 1 1 1,前面不变。

与之前的 n n n做与运算,就只剩下第 k k k位是 1 1 1了,即为 l o w b i t ( n ) lowbit(n) lowbit(n)

所以 l o w b i t ( n ) = n & ( ∼ n + 1 ) lowbit(n)=n\\&(\\sim n+1) lowbit(n)=n&(n+1)

又因为补码表示下 ∼ n = − 1 − n \\sim n = -1-n n=1n ,所以 l o w b i t ( n ) = n & − n lowbit(n)=n\\&-n lowbit(n)=n&n

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

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

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/119251807

以上是关于lowbit原理浅解的主要内容,如果未能解决你的问题,请参考以下文章

并发-CAS 原理浅解01

并发-CAS 原理浅解01

Struts2拦截器浅解

Tornado 异步浅解

String StrigBuffer StringBuilder 浅解

树状数组的原理和基础应用