什麼是最快的方式,使用位運算符返回數字,用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;
是可能的最慢的方式。
什麼是最快的方式,使用位運算符返回數字,用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;
是可能的最慢的方式。
就轉向每一個入到位,或將它們一起:
#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;
}
做筆記但是,幾乎所有的現代編譯器將通過兩個與適量的位移位電源代替乘法。
UB如果int是16位:) – 2015-02-09 22:11:19
@MattMcNabb更正,使用'
我不認爲這些類型是Ansi-C。 – 2015-02-09 22:12:20
,最快的方式是直接存儲器的寫入,假設你知道你的系統端(這裏的假設是小端):
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
。這將節省額外的內存操作。
這是一個很好的解決方案,但它會更快*執行4(內存8位)內存寫入比執行(優化)寄存器操作和1(自然大小)內存寫入? – 2015-02-09 23:13:04
@weather葉片我猜它可以使用寄存器甚至DMA優化更多,但它變得太平臺依賴 – 2015-02-09 23:17:38
動態分配的指針被證明是訪問速度較慢,然後靜態/自動分配的指針。 – 2015-02-10 09:52:25
任何體面的編譯器都會使其成爲最快的(如下面的答案所示)。 – 2015-02-09 22:10:59
這個問題爲什麼得到-3?它不應該有任何負面的聲譽。 – Goeksenin 2015-02-09 23:53:54
我想知道同樣的事情。 – 2015-02-10 09:49:08