我正在尝试为学校项目实施erathostenes的筛选,我决定使用位数组来实现.在我搜索材料时,我遇到了这三个宏,它们完美无缺,但我无法真正阅读(理解)它们.
#define ISBITSET(x,i) ((x[i>>3] & (1<<(i&7)))!=0)
#define SETBIT(x,i) x[i>>3]|=(1<<(i&7));
#define CLEARBIT(x,i) x[i>>3]&=(1<<(i&7))^0xFF;
Run Code Online (Sandbox Code Playgroud)
能否请你详细解释其中至少一个,我对C中的按位操作有基本的了解(基本上我知道它们"存在").
这会在另一个使用不同字节序的架构上工作吗?提前致谢.
x是一系列的字符.i是位的索引.因为每个char都是8位,最后3位i定义char中的位,其余位定义数组中的char.
i>>3向右移动3位,所以你得到的部分告诉你哪个字符,x[i>>3]包含索引位的字符也是如此i.
i&7是i(自)的最后3位,所以它是char中位的索引.是一个char(真正的它是int,但在这个上下文中你可以忽略它的区别),它的位被索引为on,其余位被关闭.(钻头的面具)710==11121<<(i&7)i
char&mask 是检查位是否打开的常用方法.
char|=mask 是转入的常用方法.
char&=~mask是关闭的常用方法,如果mask是char,那么~mask==mask^0xFF.
我不认为这些宏是依赖于endiannes的.(如果你x转换int[]到*char,那是一个不同的故事)
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |