Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 下面程序中的位掩码使用来自编程Pearls_C_Mask_Bit_Programming Pearls - Fatal编程技术网

C 下面程序中的位掩码使用来自编程Pearls

C 下面程序中的位掩码使用来自编程Pearls,c,mask,bit,programming-pearls,C,Mask,Bit,Programming Pearls,我今天开始读《编程珍珠》,在做练习的时候,我遇到了一个问题:“您将如何实现自己的位向量?”。当我看到解决方案时,它是这样的: #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1 + N/BITSPERWORD]; void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); #定义比特序32 #

我今天开始读《编程珍珠》,在做练习的时候,我遇到了一个问题:“您将如何实现自己的位向量?”。当我看到解决方案时,它是这样的:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

int a[1 + N/BITSPERWORD]; 

void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); 
#定义比特序32
#定义班次5
#定义掩码0x1F
#定义N 10000000
int a[1+N/比特序];

void set(int i){a[i>>SHIFT]|=(1注意,
掩码
的设置使其具有最低的
移位
位集,其中
移位
正好是
位序
的基2对数

<> > <代码>(i和掩码)< /C>将选择<代码> > <代码>的最低5位,这与在除以32之后取余数相同(只是考虑在十进制数的最低两位数字之后如何给您除以100之后的余数)。这给出了我们感兴趣的词中的位的数量。


10x20是32,所以
i&0x1F
i
模32,这样就永远不会移位32位。这是一种保护措施,因为任何严格小于类型大小的移位都是未定义的行为。

感谢回复Henning。如果我用
替换
(i&MASK)
,这是否有效(i%32)
?如果它有效但不优雅,那么请您解释一下为什么
i&MASK
优于
i%32
?非常感谢。是的--
i&MASK
i%32
是一样的,只要您确定
i
不是负数。按位计算,通常比除法更有效n和余数,因此成为了传统的选择。或者至少在编译器愚蠢的时候,它曾经是更有效的。今天,你可以期望即使是一个适度优化的编译器在这种情况下在内部重写
i%32
i&31
(它可以证明
i
不是负数,在这种情况下,重写总是安全的,或者它可以推断负数结果会在转换中触发未定义的行为)。太好了。非常感谢您的解释。
 1 << (i & MASK)