【问题标题】:is there any standard C functions for bitswapping? [duplicate]是否有任何用于位交换的标准 C 函数? [复制]
【发布时间】:2011-11-08 22:52:37
【问题描述】:

可能重复:
Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C

我有一个 64 位的字,我想对它做以下操作。

首先我想做一个位交换(交换位 63 和位 0 将第 62 位与第 1 位交换,依此类推)

一旦完成上述操作,我想在字节 0 和字节 7 之间进行字节交换交换 字节 1 和字节 6 以此类推。

现在我们在 gcc linux 中有一个内置函数来执行第二部分 bswap_64()。在 gcc linux C 中是否有任何函数可以执行第一部分

【问题讨论】:

  • 没有。但是我们确实有这些称为“操作员”的东西来执行这些操作......
  • 为什么你想交换位?无论是 FFT 还是家庭作业,恕我直言。
  • @wildplasser。它既不是 FFT 也不是作业。我已经捕获了一些空闲的 10GE 帧,我正在尝试将它们转换为 XGMII 编码帧。 :)
  • “Dupe”是一个很好的答案,但实际上并不是他的问题的重复。
  • @therefromhere: this answer 完美地解决了这个问题。

标签: c linux bit-manipulation


【解决方案1】:

最终效果与在位交换每个字节的效果相同。例如,首先将字节 0 复制到字节 7 并反转其位,然后再复制回字节 0 而不进行位反转。

没有对任何这些操作的内置支持,但是对每个字节进行位交换应该相当简单。最有效的方法可能是 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,这是语言不保证的。

我没有测试过。

【讨论】:

  • 根据基准there,手动展开循环并使用整数运算可能会更好,因为编译器可能不是那么聪明(而且字节寻址通常很慢)。将bytes 声明为restrict 也会有所帮助。基准测试当然是您的指南。
  • @AlexandreC.:我刚刚修正了错字。
猜你喜欢
  • 2011-03-02
  • 2014-09-17
  • 1970-01-01
  • 2010-10-13
  • 2015-10-27
  • 2021-04-13
  • 2014-08-24
  • 1970-01-01
  • 2021-06-15
相关资源
最近更新 更多