位操作用途特征与技巧

位操作在计算机中是一种非常高效的运算。其基本操作为:


基本操作


与 ,或,非,异或(两数的对应位:同为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值