2015-02-09 50 views
0

什麼是最快的方式,使用位運算符返回數字,用3個不同的unsigned char變量表示?將3個字節提取到數字

unsigned char byte1 = 200; 
unsigned char byte2 = 40; 
unsigned char byte3 = 33; 

unsigned long number = byte1 + byte2 * 256 + byte3 * 256 * 256; 

是可能的最慢的方式。

+2

任何體面的編譯器都會使其成爲最快的(如下面的答案所示)。 – 2015-02-09 22:10:59

+0

這個問題爲什麼得到-3?它不應該有任何負面的聲譽。 – Goeksenin 2015-02-09 23:53:54

+0

我想知道同樣的事情。 – 2015-02-10 09:49:08

回答

3

就轉向每一個入到位,或將它們一起:

#include <stdint.h> 

int main(void) 
{ 
    uint8_t a = 0xAB, b = 0xCD, c = 0xEF; 

    /* 
    * 'a' must be first cast to uint32_t because of the implicit conversion 
    * to int, which is only guaranteed to be at least 16 bits. 
    * (Thanks Matt McNabb and Tim Čas.) 
    */ 
    uint32_t i = ((uint32_t)a << 16) | (b << 8) | c; 

    printf("0x%X\n", i); 
    return 0; 
} 

做筆記但是,幾乎所有的現代編譯器將通過兩個與適量的位移位電源代替乘法。

+2

UB如果int是16位:) – 2015-02-09 22:11:19

+0

@MattMcNabb更正,使用'' – 2015-02-09 22:12:00

+0

我不認爲這些類型是Ansi-C。 – 2015-02-09 22:12:20

1

,最快的方式是直接存儲器的寫入,假設你知道你的系統端(這裏的假設是小端):

unsigned char byte1 = 200; 
unsigned char byte2 = 40; 
unsigned char byte3 = 33; 

unsigned long number = 0; 

((unsigned char*)&number)[0] = byte1; 
((unsigned char*)&number)[1] = byte2; 
((unsigned char*)&number)[2] = byte3; 

或者,如果你不介意做一些鍛鍊; Tibial,你可以這樣做:

union 
{ 
    unsigned long ulongVal; 
    unsigned char chars[4]; // In case your long is 32bits 
} a; 

,然後通過分配:

a.chars[0] = byte1; 
a.chars[1] = byte2; 
a.chars[2] = byte3; 
a.chars[3] = 0; 

你會讀最終值從a.ulongVal。這將節省額外的內存操作。

+0

這是一個很好的解決方案,但它會更快*執行4(內存8位)內存寫入比執行(優化)寄存器操作和1(自然大小)內存寫入? – 2015-02-09 23:13:04

+0

@weather葉片我猜它可以使用寄存器甚至DMA優化更多,但它變得太平臺依賴 – 2015-02-09 23:17:38

+0

動態分配的指針被證明是訪問速度較慢,然後靜態/自動分配的指針。 – 2015-02-10 09:52:25