EyeOfProvidence

首页 新随笔 联系 聚合 管理
  11 Posts :: 0 Stories :: 25 Comments :: 0 Trackbacks

本文内容遵从CC版权协议 转载请注明出自:   http://www.cppblog.com/EyeOfProvidence/

程序设计语言中有各种各样的运算符,除了四则运算的加减乘除外,还有各式各样的位运算符(|,~,&,^)。说实话,我也没记清这些运算符的优先级,当然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来表示。

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

posted on 2010-01-05 23:12 MasterLuo 阅读(1474) 评论(2)  编辑 收藏 引用 所属分类: 编程相关

评论

# re: 位运算的那些事儿[未登录] 2010-01-06 03:29 R
如测试k的第m位是否为1可以这样做:k&(1<<m)==1

应为k&(1<<m)!=0
  回复  更多评论
  

# re: 位运算的那些事儿 2010-01-06 08:03 MasterLuo
@R
谢谢,确实写错了。己经修改。  回复  更多评论
  


专题:Android  iPad jQuery Chrome OS

博客园首页  IT新闻  知识库  学英语  C++程序员招聘
标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
每天10分钟,轻松学英语
网站导航: