lowbit()
lowbit(n)
的作用是给出n二进制下最小1所在位置,例如n=6
时,其二进制为110,则lowbit(n)=2
根据其定义我理解为求其因子中2的最大的幂,例如lowbit(18)
应该是2,18的二进制为10010,最小1在2,结论没错。
计算方式:
1.x&(x^(x-1))
由于我们需要保留最小1的值,我们可以发现二进制数减一,就等同于从其最小1所在位置开始向后全部取反,例如
1001000 - 1 =
1000111
然后我们需要去掉倒数第三位(原先最小1所在位置)以外所有1,于是进行异或
1001000 ^
1000111 =
0001111
ok那前面多余的都去掉了,还剩后面的,接下来分析一下现在的情况,最小1及其以后的位置在减一时取反一次,在异或时全部变成1了,那么去除多余的1只需要将其与原来的数字与一下就行
1001000 &
0001111 =
0001000
,即得出答案,公式为x&(x^(x-1))
2.x&-x
这是用了计算机编码的性质,-x就是x的二进制数取反加一
-x+1=-(x-1)
,所有其原理与前面说的一样,不在赘述