将两个字节转换为16位值的最有效方法?

时间:2013-04-12 02:35:15

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

说第一个字节= 2(dec),第二个字节= 1(dec)。

因此,第一个字节代表257(dec)。 因此,第二个字节代表1(dec)。

所以(总)16bit值是258(dec)。

所以,如果我这样做:

  (byte1*256)+byte2

这是'正确'的方式吗?或者有更好的方法吗?

谢谢, 吨。

3 个答案:

答案 0 :(得分:4)

对于大多数现代优化工具,没有"正确的"这样做的方式:您的代码将转换为系统中最快的代码,可能包括

  • 将字节分别加载到低位和高位部分寄存器 - 不进行转换,将字节直接加载到各自的位置。
  • 将顶部字节移位并在低位字节进行OR运算 - 类似于byte1<<8 | byte2
  • 将顶部字节移位并添加低字节 - 与上述相同,但+代替|
  • 除外
  • 在您的系统上快速运行的完全不同的东西 - 不同的体系结构可能具有上面未描述的特定于体系结构的优化。

在你的源代码中,你应该专注于让人类读者清楚你的意图:如果它乘以256,这对你的读者最有意义,那么就使用乘法;如果是位移,则使用位移。编译器将尽可能提高您的代码效率。

答案 1 :(得分:1)

这应该有效:

(byte1<<8) | byte2

但我觉得这里可能有一个问题。如果您的byte1byte2数据类型的大小只有1个字节(即8位),那么移位可能无济于事。

我认为你做的方式应该完全没问题。但是,对于踢球,这样的事情可能也会起作用:

int16 total = byte1;
total = (total<<8) | byte2

答案 2 :(得分:0)

您可以使用移位运算符,它会移位: (byte1&lt;&lt; 8)+ byte2

向左移动与乘以2的幂相同。在上例中,

(2 <&lt; 8)与(0b 0000 0010 <&lt; 8)相同,即(0b 10 0000 0000)。

我们移位8,因为一个字节有8位。