我有一个关于在C中构造位掩码的问题.我需要屏蔽掉'long int'中最不重要的一半,所以我只剩下上半部分.无论我是在64位还是32位平台上,我都需要确保它屏蔽掉一半.我看到__WORD_SIZE在limits.h中定义.最初我这样做:
#define UPPER(X) ( X & ( ~0 << (__WORDSIZE/2) ) )
Run Code Online (Sandbox Code Playgroud)
什么是最正确和最有效的方法呢?
a_m*_*m0d 13
我建议你使用类似的东西
#define UPPER(x) (x & (~0 << (sizeof(x) * 4)))
Run Code Online (Sandbox Code Playgroud)
即使limits.h不存在或者由于某种原因__WORDSIZE未定义,这也会起作用.此外,它也适用于其他类型,所以你可以在int,short,char等上使用它.
任何体面的编译器都会计算出它的值
sizeof(x) * 4
Run Code Online (Sandbox Code Playgroud)
在编译时(因为它们都是常量),这意味着你不必担心那里的任何性能.
编辑:更正错误 - sizeof以字节为单位返回大小而不是位,因此我们必须乘以4(8/2)才能得到正确的结果.感谢那些指出这一点的人.
编辑2:如果你想真正迂腐,你可以使用
#define UPPER(x) (x & (~0 << (sizeof(x) * CHAR_BITS / 2)))
Run Code Online (Sandbox Code Playgroud)
CHAR_BIT是limits.h中定义的常量- 它指定字符中的位数,并且是特定于平台的.但是,这并不是必需的(通常),因为AFAIK通常没有使用ATM的平台使用非标准大小的字节.