C位数组宏,谁能解释我这些如何工作?

pru*_*nat 4 c macros bitarray

我正在尝试为学校项目实施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中的按位操作有基本的了解(基本上我知道它们"存在").

这会在另一个使用不同字节序的架构上工作吗?提前致谢.

asa*_*elr 5

x是一系列的字符.i是位的索引.因为每个char都是8位,最后3位i定义char中的位,其余位定义数组中的char.

i>>3向右移动3位,所以你得到的部分告诉你哪个字符,x[i>>3]包含索引位的字符也是如此i.

i&7i(自)的最后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,那是一个不同的故事)