位操作在计算机中是一种非常高效的运算。其基本操作为:
基本操作
与 ,或,非,异或(两数的对应位:同为0,异为1。如:0110 ^1100 = 1010)
先说说用途吧。
一、用途
1、没想到的交换操作(不引入任何变量)
交换操作除了可以用 f(&a, &b)实现外,如果要求不能引入任何新的变量。则可用异或操作:
a的二进制为 13=8+4+1=1101(二进制)
b的二进制为 6=4+2=110(二进制)
第一步 a^=b a = 1101 ^ 110 = 1011;
第二步 b^=a b = 110 ^ 1011 = 1101;即b=13
第三步 a^=b a = 1011 ^ 1101 = 110;即a=6
其背后原理是:a=a^b; b=a^b=(a^b)^b; //b变成a了; a=a^b=(a^b)(a^b)^b //a变成b了
异或操作满足交换律;
任何数和它自身异或结果为0,而任何数和0进行异或,结果为其自身。所以,b=(a^b)^b=a^(b^b)=a
任何数与-1即oxFFFFFFFF异或相当于取反
2、搜索引擎
大家知道在我们几乎每天使用的搜索操作中,其后台最核心的算法就是位操作。搜索引擎为每一个关键词建立索引。索引其实就是一个以关键词为行首,后面跟着一长串“0“”1“字符,每一个”0“或者”1“字符代表了一个网页,1表示此网页中出现了关键词,0表示未出现。这样的话,如果要找某个关键词,只需要把1的网页都列出来即可。如果是多个关键词组合查找的操作,只需要做”与”“或” “非”等组合操作即可。所以,索引实际山刚就是一张大表,这个大表以shard的方式分布在多个计算节点上(应该是以把行拆分开了),搜索关键词时,在多个节点的sharded索引中同时查询,汇聚后,汇总结果。详见吴军博士的数学之美。
3、大数据变小
BitSet数据结构常用来处理大数据问题,也就是说把大数据变小。详见:BloomFilter算法的内容。
二、特征
1、一个数b除以2(等价于该数的二进制右移1位),余数为1,表示移位前的最后一位是1;如果求二进制的01个数就可以利用此特征。余数为1的判定,可利用下列操作:b &ox01,结果必为0或1
2、一个数a和a-1进行与操作,其结果是最后一位为1的位,被置为0了。 例如:a=1101; a-1=1100; 则: a&(a-1)=1100,所以,如果求一个数的二进制有多少个1时,可用此方法,循环操作,循环次数为1的个数,即可很快得到答案。不需要一位一位判定。详见:编程之美的“求二进制数中1的个数”
3、
Morewindows总结地相当全面:http://blog.csdn.net/morewindows/article/details/7354571