高效的连接

时间:2016-10-14 12:19:16

标签: c bit-manipulation concatenation bitwise-operators

目前我正在尝试通过LPWAN发送消息,我面临的一个问题是尽量让我的消息尽可能短。

例如:

我有两个整数(0-100)和两个布尔值我必须转换为十六进制才能通过LPWAN发送。例如:

  • 24
  • 63
  • 是的

当我将其连接为246310(十六进制:3C226)时,这将占用3个字节。但是,我知道我的第一个整数永远不会高于50,只有6位。我是否可以使十六进制消息比3C226短?

2 个答案:

答案 0 :(得分:3)

是的,这应该是可能的。

您的字段的位数为:

  • integer0:整数0..50,6位。
  • integer1:整数0..80,7位。
  • flag0:布尔值,1位。
  • flag1:布尔值,1位。

这样总共有6 + 7 + 1 + 1 = 15位。

以下是如何编码:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |                 |                    |  |  |
|  |  integer0       |  integer1          |f0|f1|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

uint16_t encode(uint8_t integer0, uint8_t integer1, bool flag0, bool flag1)
{
  return ((uint16_t) integer0 << 9) | ((uint16_t) integer1 << 2) | ((uint16_t) flag0 << 1) | flag1;
}

答案 1 :(得分:2)

使用2个字节,该值可以存储为:

   FirstNum         Second        1st bool     2nd bool
<------------> <------------> <------------> <------------>
     6bits          7bits          1bit          1bit

你仍然留下1位。

使用left shift&lt;&lt;操作实现上述目的。