2013-03-20 21 views
2

我從C中的一個字節中提取第8位。這裏是我的例子。 從字節中提取一位的效率

register unsigned char byte; 

int pos = 7; 

int x =(byte >> pos) & 1; //Method I 

int y =(byte & 0x80) >> pos; //Method II 

這兩種技術將導致相同的輸出,但是所述方法比其他更有效的一個?

+1

方法,如果POS具有不同的值 – 2013-03-20 02:46:42

+0

如果操作的性能對您重要的,那麼你就需要檢查編譯器生成組件2將無法正常工作並以此爲基準。 – joshuanapoli 2013-03-20 02:46:46

+0

他們是相同的,但你可以優化它的具體指令集通過下去組裝和使用跳轉如果零/跳轉,如果攜帶指令... – nonsensickle 2013-03-20 02:47:29

回答

4

兩者都是一樣的。 AND和SHR指令都是intel CPU上的1個時鐘指令。

+0

好點。我認爲不管在一個字節中的位值(一個或零),CPU將執行所有位的AND操作。 – katta 2013-03-20 14:25:29

1

按位操作基本上是您在計算機上找到的最快速的事情之一。我會想象,任何區別將是令人難以置信的未成年人,所以它並不重要。

1

如果你知道你在編譯時被抽取該位,那麼這兩種方法應具有大致相同的速度:

unsigned char val; 
const int pos = 4; 
... 
int x = (val >> pos) & 1; 
int y = (val & 0x10) >> pos; 

然而,如果你計算在運行時,而不是作爲一個恆定的位置,做在和最後應該會更快:

unsigned char val; 
int pos; 
... 
/* requires only a shift and AND */ 
int x = (val >> pos) & 1; 
/* requires two shifts and AND */ 
int y = (val & (1 << pos)) >> pos;