2015-10-15 42 views
0

我想創建一個掩碼設置位,用於第一n半字節, 這些半字節,其中n <=8m <=4的第一m位。創建一個32位的最有效的方法的位掩碼

通過高效,我的意思是一種最小化按位操作的方式。

目前我使用暴力破解的方法:首先創建一個nybble mask,然後左移mask,並將這些數字ORing在一起。

這裏是我當前的方法:

#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)) 
+0

請包括一些例子,你嘗試至今。 –

+1

4次8只是32.這是一個很小的查找表。 – shawnt00

+0

或32#定義? – shawnt00

回答

4

您可以使用

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

yay !!!!!!!謝謝! – Jacko

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; 
} 

順便說一句,這有什麼錯位操作?他們更有效率。見法爾克Hüffner的答案...

+0

謝謝。按位操作非常棒;我的意思是最小化計算中使用的按位運算符的數量。 – Jacko

相關問題