交换 16 位数字中的前 5 位和后 5 位

Swap first and last 5 bits in a 16-bit number

我有一些 C/C++ 代码,其中有一个 16 位数字 (uint16_t),我需要将前 5 位与后 5 位交换,保留它们的左边- 在每个 5 位块内从右到右的顺序。中间 6 位需要保持不变。我不擅长按位 maths/operations 所以帮助将不胜感激!

从概念上讲,位置的转换看起来像:

ABCDEFGHIJKLMNOP 变为 LMNOPFGHIJKABCDE

或更准确地说...

10101000000001010 变为 0101000000010101.

如有任何帮助,我们将不胜感激!

首先,您应该检查您使用的任何库是否已经 RGB-BGR 交换 R5G6B5 像素。

这是您在问题中所写内容的直译。 real-time 视频可能太慢了:

uint16_t rgbswap(uint16_t in) {
    uint16_t r = (in >> 11) & 0b011111;
    uint16_t g = (in >> 5)  & 0b111111;
    uint16_t b = (in >> 0)  & 0b011111;

    return b << 11 | g << 5 | r << 0;
}

无需将输入分成 3 个独立的 R、G 和 B 分量,您可以通过移至更高位来并行处理 R 和 B

uint16_t rgb2bgr(uint16_t in)
{
    uint16_t r0b = in & 0b1111100000011111;
    uint16_t b0r = ((r0b << 22) | r0b) >> 11;
    return b0r | (in & 0b11111100000);
}

使用乘法交换 R 和 B 的另一种方法

uint16_t rgb2bgr_2(uint16_t in)
{
    uint16_t r0b = in & 0b1111100000011111;
    uint16_t b0r = r0b * 0b1000000000000000000000100000 >> 16;
    return b0r | (in & 0b11111100000);
}

它基本上是 this technique,可用于提取位或四处移动位

您可以检查 compiled result on Godbolt 以查看乘法方法产生较短的输出,但它只有在您有快速乘法器时才有用