The Fourth Dimension Space

枯叶北风寒,忽然年以残,念往昔,语默心酸。二十光阴无一物,韶光贱,寐难安; 不畏形影单,道途阻且慢,哪曲折,如渡飞湍。斩浪劈波酬壮志,同把酒,共言欢! -如梦令

位运算的那些事儿

程序设计语言中有各种各样的运算符,除了四则运算的加减乘除外,还有各式各样的位运算符(|,~,&,^)。说实话,我也没记清这些运算符的优先级,当然google一下还是可以查出来的。优先级从高到底是~&^|。在平常应用中,位运算有很强的作用。现在就我使用位运算很好用的东西来说说位运算是非常强大的。
运算符 作用 样例 结果
按位取反 ~1001 0110
& 两个1为1,否则为0 1101&0101 0101
^ 相同为0,不同为1 1101^0101 1000
两个0为0,否则为1 1101|0101 1101

1:简单应用
把某一位置0或置1。如果想把k的第m位置0,则可以这样做:k&=~(1<<m)。如果想把k的第m位置1,则可以这样做:k|=(1<<m)。
测试某一位为1或0。如测试k的第m位是否为1可以这样做:k&(1<<m) != 0。
2:枚举所有子集合。如果数据不大,可以让每一位对应一个集合,1就是子集中,0就没在子集中。
for(int i = 0; i < (1<<m); ++i) {
    
for(int k = 0; k < m; ++k) {
        
if(i&(1<<k)) {
            
//in subset
        }
    }
}
这个地方还有更好的办法(对于第二重循环)也是使用位运算,大家可以想一想。

3:表示一位特殊值。如~0表示2^32-1
4:不使用中间变量交换两上变量的值。利用异或的性质。如交换a,b的值,可以这样:a^=b, b^=a, a^=b。
5:只保留最后一个非0位。可以使用x&(~(x-1))即可。
6:求模2的除数。因为只判断二进制的最未位就行了,故可以用x&1来表示。

对于位运算还有很好很好的用法,由于本人水平有限,如果您有很好的使用位运算的方法,请留言分享。谢谢。

转自:http://www.cppblog.com/EyeOfProvidence/archive/2010/01/05/104868.html

posted on 2010-01-20 08:04 abilitytao 阅读(349) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理