其实这个表达式在以前写线段树的时候遇到过了,只是一直没认真去想为什么。它的意义是:
x = x & (x-1)能够将x(二进制表示)的最右边的1变成0
为什么呢?稍加证明一下:
0. 首先需要知道一个简单的事实,a & a = a,无论a = 0还是1。
1. 如果x最右边的1在第k+1位(k>=0),即x = ###10…0(k个0),那么x-1 = ###011…1(k个1),所以与运算的结果为###00…0(k+1个0)。
一般的博客都会写一段经典的C/C++代码来说明,现在我用python演绎一下:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'jacket'
import sys
def EliminateTheRightMostOne(x):
print('Before, x = {0}'.format(bin(x)[2:]))
x = x & (x - 1)
print('After, x = {0}\n'.format(bin(x)[2:]))
return x
def main(args):
x = int(args[0])
while x:
x = EliminateTheRightMostOne(x)
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
运行结果为:
>> python TheRightMostOne.py 7
Before, x = 111
After, x = 110
Before, x = 110
After, x = 100
Before, x = 100
After, x = 0
参考:http://blog.youkuaiyun.com/likendsl/article/details/8925700