当16位整数的范围为0-255时,如何将16位整数转换为8位而不丢失16位整数的数据值

时间:2014-05-15 05:20:40

标签: c++ opencv 16-bit 8-bit

int samples = 8;  

for (unsigned int i = 0; i < (pow(double(2),samples)-1); i++)
{
unsigned int number = i << 1;
}

我正在使用Opencv库在C ++中进行编码。 我想通过这个进行比特移位,这应该在0-255的范围内,但是它跨越255范围并且一直到508。

在Matlab中,bitshift运算符将范围保持在0-255之间。 matlab中的模式是0,2,4 ... 254,1,3,5 ... 255。但在C ++中,它的结果是0,2,4,254,256,258 ...... 508。 我想要与matlab相同的答案。请建议我这样做。

3 个答案:

答案 0 :(得分:4)

在C ++中,i << 1等同于i * 2,如果i是无符号整数。

这与“将16位整数转换为8位”无关。一种方法是屏蔽掉除低8之外的所有位:(number & 0xFF)或等效(number % 256)

如果您乘以2然后执行此转换,您将在0之后获得254。但这仍然不是你想要的。您的目标输出在后半部分添加了1

所以,为了得到你可以使用:

for (int i = 0; i < 256; i++)
    number = (i * 2) % 256 + (i >= 128);

答案 1 :(得分:2)

序列0, 2, 4, 6, ..., 252, 254, 1, 3, 5, ..., 253, 255(根据您显示的序列看起来就像您所追求的那样)可以通过以下方式生成:

for (int i = 0; i != 257; i = (i == 254) ? 1 : i + 2)
    doSomethingWith (i);

可能还有许多其他方法可以生成该序列,包括可能更具可读性的双循环版本,前提是您可以保持循环体小:

for (int i = 0; i < 256; i += 2) doSomethingWith (i); // 0, 2, 4, 6, ..., 254
for (int i = 1; i < 256; i += 2) doSomethingWith (i); // 1, 3, 5, 7, ..., 255

答案 2 :(得分:1)

abcdefgh << 1变为bcdefgha时,看起来Matlab正在进行循环8位移位。 C ++没有这样的东西,但你可以通过

来模拟它
number = ((i << 1) & 0xff) | (i>> 7);