【问题标题】:Efficient concatenation高效连接
【发布时间】:2017-02-23 21:01:43
【问题描述】:

我正在尝试通过 LPWAN 发送消息,而我面临的问题之一是试图让我的消息尽可能短。

例如:

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

  • 24
  • 63
  • 是的
  • 错误

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

【问题讨论】:

  • @LPs 它们总是2个整数和2个布尔值,第一个整数总是0到50,第二个整数总是0到100
  • 在您的评论中,您指定第二个整数在 [0, 100] 范围内,但在您的问题中它是 [0, 80]。如果它实际上是 [0, 100],请编辑您的问题。
  • 此外,除非这些变量之间存在任何依赖关系,否则您将始终需要至少 ceil(log(51 * 101 * 2 * 2) / log(2)) = 15 位来发送这些消息。在这种情况下,unwind 的答案尽可能高效,而且使用起来也很容易。
  • 完成了,尽管它对问题没有任何影响,因为 100 和 80 一样是 7 位
  • 它几乎有所作为。如果你有 [0, 50], [0, 79], [0, 1], [0, 1] 的范围,如果你使用另一种技术,你只需要至少 14 位。

标签: c bit-manipulation concatenation bitwise-operators


【解决方案1】:

是的,应该可以的。

您的字段的位数是:

  • 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;
}

【讨论】:

    【解决方案2】:

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

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

    你还剩下 1 位。

    使用left shift

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2015-02-15
      相关资源
      最近更新 更多