2014-01-30 3 views
3

Я могу придумать три способа сделать это с головы. Я расскажу им об этом быстро.Какова наилучшая практика создания битовой маски для ряда бит?

char mask = (1<<top) 
mask = mask-1 
mask = mask>>bot 
mask = mask<<bot 
3 shifts, 1 addition 

char topMask = (1<<top) 
topMask = topMask -1 
char botMask = (1<<bot) 
botMask = botMask - 1 
char mask = topMask - botMask 
2 shifts, 3 additions 

char mask = (1<<(top-bot)) 
mask = mask - 1 
mask = mask << bot 
2 shifts, 2 additions 

Кажется, что первый будет немного быстрее? Считается ли лучшим по стилю? Есть ли действительно хороший способ, которого я пропускаю, или я делаю что-то глупое? Благодаря!

Мне было бы особенно интересно, сможет ли кто-нибудь указать мне место, которое это делается в ядре linux.

EDIT: кто-то разместил что-то подобное в другом виде и удалил его? Довольно похож на второй. Но XOR вместо вычитания.

char mask = ((1<<top)-1)^((1<<bot)-1) 
+0

У этого вряд ли есть ответ «лучшей практики». Выберите, какая версия кажется ясной, прокомментируйте, что она делает, затем переходите. –

ответ

2

Вы можете попробовать табличного подход:

static const char LUT[][] = { // index like this LUT[bot][top] 
//top: 0  1  2  3  4  5  6  7  8 
     0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // bot: 0 
     0x00, 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0x7E, 0xFE, // bot: 1 
     0x00, 0x00, 0x00, 0x04, 0x0C, 0x1C, 0x3C, 0x7C, 0xFC, // bot: 2 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0xF8, // bot: 3 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x70, 0xF0, // bot: 4 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0xE0, // bot: 5 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, // bot: 6 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, // bot: 7 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // bot: 8 
}; 

char mask = LUT[bot][top]; 

также: Если по какой-либо причине вы идете с битами это решение требует меньше опа. Кроме того, суперскалярный процессор должен оценивать левую и правую стороны xor параллельно.

char mask = (0xFF << top)^(0xFF << bot); 
Смежные вопросы