gpt4 book ai didi

C 位数组宏,谁能解释一下这些是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 15:22:37 25 4
gpt4 key购买 nike

我正在尝试为学校项目实现 erathostenes 筛,我决定使用位数组来实现。在搜索资料时,我遇到了这 3 个宏,它们可以完美地工作,但我无法真正阅读(理解)它们。

#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;

能否请您至少向我详细解释其中一个,我对 C 中的按位运算有非常基本的了解(基本上我知道它们“存在”)。

这是否适用于使用不同字节顺序的另一种架构?提前致谢。

最佳答案

x是字符数组。 i是位的索引。因为每个char是8位,即i的后3位定义char中的位,其余位定义数组中的char。

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

i&7i 的最后 3 位(自 7<sub>10</sub>==111<sub>2</sub> 起),因此它是 char 中位的索引。 1<<(i&7)是一个 char(实际上它是 int,但在这种情况下您可以忽略差异),它的位由 i 索引打开,其余部分关闭。 (位掩码)

char&mask是检查位是否打开的常用方法。

char|=mask是上交位的常用方法。

char&=~mask是关闭位的常用方法,如果 mask是char,那么~mask==mask^0xFF .

我不认为这些宏依赖字节序。 (如果你通过将 x 转换为 int[] 得到了 *char ,那就是另一回事了)

关于C 位数组宏,谁能解释一下这些是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com