使用有限的内存操作完成字节中的位反转。完成后,修改代码让它运行得尽可能快(但没有内存限制)
优化和正确性相比,总是居于次要位置。
uint8_t SwapBitsInByte(uint8_t input)
{
uint8_t output=0;
for(uint8_t i=0; i<8; i++)
{
if(input & (1 << i))
Output |= 1 << (7-i);
}
}
速度优先,内存足够。可以使用查找表的思想。(使用switch语句替换if-else语句的时候,编译器也会创建一个查找表,查看汇编代码能找到)
uint8_t SwapBitInByte(uint8_t input)
{
const uint8_t lookup_table[256] = {0x00, 0x80, 0x40, 0xC0, ..., 0x7F, 0xFF};
return lookup_table[input];
}
当系统有较多的代码空间而希望缩短运行时间时。
减少内存消耗的一种比较好的方法,首先反转相邻的两位,再反转相邻的两个字节,之后反转半字节。没有使用零时变量,估计至多使用一个寄存器。
uint8_t SwapBitInByte(uint8_t val)
{
val = (val & 0x55) << 1 | (val & 0xAA) << 1;
val = (val & 0x33) << 2 | (val & 0xCC) << 2;
val = (val & 0x0F) << 4 | (val & 0xF0) << 4;
return val;
}