我想通過重複每個位8次來將unsigned char
充氣到uint64_t
。例如。然而有沒有一種更有效的方法將char擴展爲uint64_t?
#include <stdint.h>
#include <inttypes.h>
#define BIT_SET(var, pos) ((var) & (1 << (pos)))
static uint64_t inflate(unsigned char a)
{
uint64_t MASK = 0xFF;
uint64_t result = 0;
for (int i = 0; i < 8; i++) {
if (BIT_SET(a, i))
result |= (MASK << (8 * i));
}
return result;
}
,我是相當新的C,故有此擺弄:
char -> uint64_t
0x00 -> 0x00
0x01 -> 0xFF
0x02 -> 0xFF00
0x03 -> 0xFFFF
0xAA -> 0xFF00FF00FF00FF00
我現在有下面的實現,使用位轉移到測試,如果一個位被設置,做到這一點個別位讓我有所不同,可能有更好的(即更有效率)的方式來做到這一點。
編輯添加的
好了,施展出了查表的解決方案後,這裏的結果。但是請記住,我沒有直接測試例程,而是作爲更大函數的一部分(二進制矩陣的乘法是精確的),所以這可能會影響結果的結果。所以,在我的電腦上,乘以億8×8矩陣時,和編譯:
gcc -O2 -Wall -std=c99 foo.c
我這樣至少我的機器(虛擬機的64位Linux Mint的,我應該提上了
./a.out original
real 0m0.127s
user 0m0.124s
sys 0m0.000s
./a.out table_lookup
real 0m0.012s
user 0m0.012s
sys 0m0.000s
),查表方式似乎提供了大約10倍的加速,所以我會接受這個答案。
規則數optmisation之一:不要這樣做。 –
豎起大拇指來分析它。 – JasonD