发现了两种算法,一种查表,另一种是多次移位和交换。计算结果完全相同,不知道哪种效率更高,应该差不多。
移位交换
constexpr uint8_t reverse_byte(uint8_t b) {
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}
这个算法来自:Stack Overflow。
查表
可以用256 字节的大表只查一次解决,也可以用16 字节的小表,依次翻转高4 位和低4 位,我用了小表。
constexpr uint8_t reverse_half_byte(uint8_t half) {
constexpr uint8_t TABLE[] = {
0b0000, // 0 : 0b0000
0b1000, // 1 : 0b0001
0b0100, // 2 : 0b0010
0b1100, // 3 : 0b0011
0b0010, // 4 : 0b0100
0b1010, // 5 : 0b0101
0b0110, // 6 : 0b0110
0b1110, // 7 : 0b0111
0b0001, // 8 : 0b1000
0b1001, // 9 : 0b1001
0b0101, // 10 : 0b1010
0b1101, // 11 : 0b1011
0b0011, // 12 : 0b1100
0b1011, // 13 : 0b1101
0b0111, // 14 : 0b1110
0b1111, // 15 : 0b1111
};
return TABLE[half];
}
constexpr uint8_t reverse_byte_by_table(uint8_t b) {
uint8_t h = b >> 4;
uint8_t l = b & 0xf;
h = reverse_half_byte(h);
l = reverse_half_byte(l);
return (l << 4) | h;
}
8058

被折叠的 条评论
为什么被折叠?



