可能重复:
Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C
我有一个64位字,我想对它进行以下操作。
首先,我想进行位交换(与位0交换位63) 将位62与位1交换,依此类推)
完成上述操作后,我想在字节0和字节7之间进行字节交换交换 字节1和字节6等等。
现在我们在gcc linux中有一个内置函数来做第二部分bswap_64()。有没有函数可以做第一部分在gcc linux C中可用
答案 0 :(得分:6)
净效果与每个字节的位交换相同。例如,字节0首先复制到字节7,其位反转,然后复制回byte0,没有位反转。
对于任何这些操作都没有内置支持,但是对每个字节进行位交换应该相当简单。最有效的方法可能是256个元素的查找表。
uint64_t the_word = /* whatever */
unsigned char *bytes = &the_word;
for (i = 0; i < 7; i ++) {
bytes[i] = reverse[bytes[i]];
}
其中:
const unsigned char reverse[UCHAR_MAX+1] {
0x00, 0x80, ..., 0xFF
}
您可以编写一个小程序来计算每个字节值的位交换值,并为bytes
的初始化生成源代码。 (或者,既然你正在编写代码来进行计算,你可以在程序中使用它来代替查找表;它取决于速度的重要性。)
例如,这假定CHAR_BIT == 8
,语言无法保证。
我没有测试过这个。