[英]Can anyone explain me how to return a two dimensonal array in C from a function?
[英]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 = 8
, i / 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))
;
在最后一个宏之后
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.