-2
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 中,位移运算符的范围保持在 0-255 之间。matlab中的模式是0,2,4...254,1,3,5...255。但在 C++ 中,它的值是 0,2,4,254,256,258...508。我想要和matlab一样的答案。请建议我一些想法来做到这一点。

4

3 回答 3

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);
于 2014-05-15T05:27:00.073 回答
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
于 2014-05-15T05:27:11.190 回答
1

看起来 Matlab 正在做循环 8 位移位,什么时候abcdefgh << 1变成bcdefgha. C++没有这样的东西,但你可以模拟它

number = ((i << 1) & 0xff) | (i>> 7);
于 2014-05-15T05:49:35.063 回答