【问题标题】:How to convert 16 bit integer to 8 bit without loosing the data values of the 16 bit integer when the range of 16 bit integer is 0-255当 16 位整数的范围是 0-255 时,如何将 16 位整数转换为 8 位而不丢失 16 位整数的数据值
【发布时间】:2014-07-03 09:41:45
【问题描述】:
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一样的答案。请给我一些建议。

【问题讨论】:

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


【解决方案1】:

在 C++ 中,i &lt;&lt; 1 等效于 i * 2,如果 i 是无符号整数。

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

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

所以,你可以使用:

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

【讨论】:

  • 由于 Matlab 确实产生了 255 的值,它不能以 255 为模。
  • 是的,我后来看到了
  • 这并没有给出所需的序列0,2,4...254,1,3,5...255,而是给出了0, 0, 0, ... 无限。您需要以某种方式添加两个而不是乘以两个。
  • @paxdiablo,为我工作.. ideone.com/gBq5Vv 。也许对变量名有些混淆
  • 由于某种原因,我无法理解您的ideaone 代码,但我想我明白了。您正在循环从 0 到 255 的数字,但您从中构造的变量是您给出的表达式。这就说得通了。我可能只是添加循环,这样它对我来说更有意义,并匹配问题中的变量。希望你不要介意。
【解决方案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

【讨论】:

  • 谢谢我得到了答案。
【解决方案3】:

abcdefgh &lt;&lt; 1 变为bcdefgha 时,看起来Matlab 正在执行循环8 位移位。 C++没有这种东西,你可以模拟一下

number = ((i << 1) & 0xff) | (i>> 7);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2011-10-25
    • 1970-01-01
    • 2016-03-11
    • 2018-01-12
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多