| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 576 人关注过本帖
标题:位操作的4例解释
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
 问题点数:0 回复次数:1 
位操作的4例解释
程序代码:
int set_in_use ( int car_num) {
     in_use = in_use | 1 << car_num;
} 

上面的例子第一眼看上去很难理解,比如说car_num 为 5

上面一句的意思就是:打开 in_use 的第5位(从0位开始)

首先1被左移5位,所以只有第5位是1,其余都是 0

然后再和in_use做或(|)运算,就确保了把in_use的第5位设为1

所以说下面这句也应该比较容易理解了

程序代码:
int is_in_use ( int car_num) {
    return in_use & 1 << car_num ;
}


比如car_num 为5
这就是判断in_use 的第 5位有没有被打开了

如果被打开(即是1)则返回值为非0

如果没被打开(即是0),则返回值为0

但是当我们想关掉某1位的时候该怎么办?
程序代码:
int set_unused ( int car_num) {
    in_use = in_use & ~(1 << car_num);
}

比如car_num 为5
把1 左移5位, 再翻转,

左移除了第5位是0,其他位都为 1

再和in_use做AND 运算

就确保了其他位不变,把第5位设为0

那么再看一下下面的例子用了XOR
程序代码:
void flip_use_state ( int car_num) {
    in_use = in_use  ^ 1<< car_num;
}

上面的例子又是什么意思?

比如car_num 为 5

就是想翻转 in_use 的第5位,如果是1,就翻转成0;

如果是0, 就翻转成1

仔细看一下, 1被左移5为,所以除了第5位,其他位都是0

再和in_use 做XOR运算

不论(0还是1) 和 0做XOR运算时都不变,

但是不论(0还是1)和1做XOR运算时都被翻转,

这就是上面一句话的意思了,其他位不变,翻转第 car_num(5) 位
搜索更多相关主题的帖子: return 
2012-07-26 21:59
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
你这些技巧发到 C 区也可以,不过一般这些东西,用宏干的多。
2012-07-29 15:16
快速回复:位操作的4例解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014185 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved