我從C中的一個字節中提取第8位。這裏是我的例子。 從字節中提取一位的效率
register unsigned char byte;
int pos = 7;
int x =(byte >> pos) & 1; //Method I
int y =(byte & 0x80) >> pos; //Method II
這兩種技術將導致相同的輸出,但是所述方法比其他更有效的一個?
我從C中的一個字節中提取第8位。這裏是我的例子。 從字節中提取一位的效率
register unsigned char byte;
int pos = 7;
int x =(byte >> pos) & 1; //Method I
int y =(byte & 0x80) >> pos; //Method II
這兩種技術將導致相同的輸出,但是所述方法比其他更有效的一個?
兩者都是一樣的。 AND和SHR指令都是intel CPU上的1個時鐘指令。
好點。我認爲不管在一個字節中的位值(一個或零),CPU將執行所有位的AND操作。 – katta 2013-03-20 14:25:29
按位操作基本上是您在計算機上找到的最快速的事情之一。我會想象,任何區別將是令人難以置信的未成年人,所以它並不重要。
如果你知道你在編譯時被抽取該位,那麼這兩種方法應具有大致相同的速度:
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;
方法,如果POS具有不同的值 – 2013-03-20 02:46:42
如果操作的性能對您重要的,那麼你就需要檢查編譯器生成組件2將無法正常工作並以此爲基準。 – joshuanapoli 2013-03-20 02:46:46
他們是相同的,但你可以優化它的具體指令集通過下去組裝和使用跳轉如果零/跳轉,如果攜帶指令... – nonsensickle 2013-03-20 02:47:29