x & (x-1)的意义

来源:互联网 发布:oracle数据库好学吗 编辑:程序博客网 时间:2024/06/08 15:56

其实这个表达式在以前写线段树的时候遇到过了,只是一直没认真去想为什么。它的意义是:

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 sysdef EliminateTheRightMostOne(x):    print('Before, x = {0}'.format(bin(x)[2:]))    x = x & (x - 1)    print('After, x = {0}\n'.format(bin(x)[2:]))    return xdef main(args):    x = int(args[0])    while x:        x = EliminateTheRightMostOne(x)if __name__ == '__main__':    sys.exit(main(sys.argv[1:]))

运行结果为:

>> python TheRightMostOne.py 7Before, x = 111After, x = 110Before, x = 110After, x = 100Before, x = 100After, x = 0

参考:http://blog.csdn.net/likendsl/article/details/8925700

1 0