owbit(x)是x的二进制表达式中最低位的1所对应的值。
比如,6的二进制是110,所以lowbit(6)=2。
最近回头看树状数组,发现关于lowbit()函数,目前有两种算法。
第一种是比较常见的,也是我一直在用的:
int lowbit(int x)
{
return x&(-x);
}
最近发现了另一种算法,如下所示:
int lowbit(int x)
{
return x&(x^(x-1));
}
两种算法的结果都是对的。
相比之下,第一种算法利用了负整数的补码特性,非常的巧妙,而第二种算法用另外一种方式计算出了最低位,其思想跟补码的也很相似。当然还是推荐第一种,不仅巧妙而且好记。
原文:https://www.cnblogs.com/mirage0/p/13914207.html