Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35093
  • 博文数量: 12
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-24 20:46
文章分类

全部博文(12)

文章存档

2014年(5)

2013年(3)

2012年(4)

我的朋友

分类: C/C++

2013-02-05 10:12:54

最近看编程珠矶的第一章位图排序,对位运算不是太理解,网上查了些资料,总结如下:
    #define BITSPERWORD 32
    #define SHIFT 5
    #define MASK 0x1F
    #define N 10000000

    int a[1 + N / BITSPERWORD]

    假设一个整形数字是由4个字节构成, a是位数组


    1.置位操作:
        void set(int i) {   
         a[i>>SHIFT] |=  (1<<(i & MASK));
     } 
    要给相应的位置位先要寻找行号:i / 32,即:i >> SHIFT
    再寻找列号:i % 32,即 i & MASK,这里解释下为什么这两个表达式等价。i % 32即i对32取模,得到一个0-31之间的一个数,
    同样由于MASK = 0x1F = 31,所以 i & MASK 同样是一个0-31之间的一个数。
    最后给a[i>>SHIFT] 中相应的列置位 a[i>>SHIFT] |= (1<<(i & MASK)),或操作并不改变其它列的结果。

    2.清除操作:
            void clr(int i) {     
       a[i>>SHIFT] &= ~(1<<(i & MASK));
     }  


    3.测试操作:
    int  test(int i){ 
        return a[i>>SHIFT] & (1<<(i & MASK)); 
    }  

阅读(193) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~