创建32位位掩码的最有效方法

时间:2015-10-15 18:03:38

标签: c bit-manipulation bitwise-operators

我想创建一个掩码来设置第一个n个nybbles的位, 以及这些nybbles的前m位,n <=8m <=4

通过高效,我的意思是最小化按位操作的方法。

目前我使用蛮力方法:首先创建一个nybble蒙版,然后保持左移动蒙版并将这些数字“或”在一起。

这是我目前的方法:

#define NIBBLE   ((unsigned int)0xF >> m))
#define MASK     ((NIBBLE | (NIBBLE << 4) |  (NIBBLE << (8)) | (NIBBLE << (12)) | (NIBBLE << (16)) | (NIBBLE << (20)) | (NIBBLE << (24)) | (NIBBLE << (28)))  >> (n*4) )

2 个答案:

答案 0 :(得分:4)

您可以使用

(0x0f0f0f0f ^ (0xf0f0f0f0 >> m)) >> (4*n)

答案 1 :(得分:1)

/* Mask within nibble: 2**n - 1 */
int i;
unsigned int mask = 1;
for (i = 0; i < n; ++i) mask *= 2;
mask -= 1;
/* For all nibbles: multiply mask by 16 for each */
unsigned int nibblemask = 0;
for (i = 0; i < m; ++i) {
    nibblemask += mask;
    mask *= 16;
}
顺便说一下,按位操作有什么问题?它们更有效率。见FalkHüffner的答案......