创建 32 位位掩码的最有效方法
Most efficient way of creating a 32 bit bitmask
我想创建一个掩码来设置第一个 n
nybbles 的位,
以及这些 nybbles 的前 m
位,其中 n <=8
和 m <=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) )
/* 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;
}
顺便说一句,按位运算有什么问题?他们更有效率。请参阅 Falk Hüffner 的回答...
您可以使用
(0x0f0f0f0f ^ (0xf0f0f0f0 >> m)) >> (4*n)
我想创建一个掩码来设置第一个 n
nybbles 的位,
以及这些 nybbles 的前 m
位,其中 n <=8
和 m <=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) )
/* 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;
}
顺便说一句,按位运算有什么问题?他们更有效率。请参阅 Falk Hüffner 的回答...
您可以使用
(0x0f0f0f0f ^ (0xf0f0f0f0 >> m)) >> (4*n)