2014-01-30 73 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內核完成的地方。

編輯: 有人發佈這樣的東西作爲另一種方式,並刪除它?很像第二個。但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); 
相關問題