繁体   English   中英

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

[英]C bit array macros, could anyone explain me how these work?

我正在尝试为学校项目实施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;

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

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

x是字符数组。 i是位的索引。 由于每个char都是8位,因此i的最后3位定义了char中的位,其余位定义了数组中的char。

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

i&7是的最后3个比特i (因为7 10 ==111 2 ),所以它的焦炭中的所述位的索引。 1<<(i&7)是一个char(真正的它是int,但在这个上下文中你可以忽略它的区别),它的位由i开启,其余位关闭。 (钻头的面具)

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

char|=mask是转入的常用方法。

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

我不认为这些宏是依赖于endiannes的。 (如果你通过将int[]转换为*char得到x ,那就是另一个故事)

首先,那些宏假设CHAR_BIT == 8 ,而i >> 3实际上是i / 8 (所以这个代码应该说i / CHAR_BIT 。)这个第一个表达式计算包含你想要的位的字节 ,因此是数组x的数组索引(应该是unsigned char的数组!)。

现在我们已经选择了正确的字节,即x[i >> 3] (或者你自己的更好的代码中的x[i / CHAR_BIT] ),我们必须进行比特摆弄。 同样, i & 7真的想成为i % CHAR_BIT ,它只提取你的位数的剩余部分,它给出了字节的偏移量。

例。 请求第44位, i = 43 ,假设CHAR_BIT = 8i / CHAR_BIT为5,所以我们在第六个字节, i % CHAR_BIT是3,所以我们看第六个字节的第四个位。

实际的比特摆弄本身就是常见的东西; 例如,测试给定位以适当的位模式执行逐位AND(即第k位的1 << k ); 设置该位使用逐位OR,并将其归零需要更多涉及的东西(想一想!)。

#define ISBITSET(x,i) (((x)[(i) / CHAR_BIT] & (1u << ((i) % CHAR_BIT))) != 0)
#define SETBIT(x,i) (x)[(i) / CHAR_BIT] |= (1u << ((i) % CHAR_BIT);
#define CLEARBIT(x,i) (x)[(i) / CHAR_BIT] &= ~(1u << ((i) % CHAR_BIT))
  • 始终在宏参数周​​围加上括号
  • 总是喜欢无符号类型的位操作
  • (1u << CHAR_BIT)对于8位平台是256
  • 有一个exra ; 在最后一个宏之后

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM