交换 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 以查看乘法方法产生较短的输出,但它只有在您有快速乘法器时才有用
我有一些 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 以查看乘法方法产生较短的输出,但它只有在您有快速乘法器时才有用