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相同的答案。请建议我这样做。
答案 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);