首页 > 解决方案 > 向字符串添加位值

问题描述

我正在尝试通过网络发送数据包,因此希望它尽可能小(就大小而言)。

每个输入都可以包含一个公共前缀子字符串,例如ABCD. 在这种情况下,我只想发送一个位,1表示当前字符串具有相同的前缀ABCD并将其附加到剩余的字符串。所以,如果字符串是ABCDEF,我会发送1EF; 如果是LKMPS,我希望按LKMPS原样发送字符串。

有人可以指出我如何在字符串中添加一点吗?

编辑:我知道1在字符串中添加 a 并不意味着这1有点 - 它只是我添加到字符串中的一个字符。这正是我的问题——对于每个字符串,我如何发送一点表示前缀匹配?然后发送的字符串的其余部分是不同的?

标签: c++bit

解决方案


在常见的网络硬件中,您将无法发送单个位。而且大多数架构也无法解决单个位。

但是,您仍然可以通过使用您可能不使用的位之一来最小化所需的大小。例如,如果您的字符串仅包含 7 位 ASCII 字符,您可以使用最高位在字符串的第一个字节中编码您想要的信息。

例如,如果第一个字节是:

0b01000001 == 0x41 == 'A' 

然后使用设置最高位|

(0b01000001 | 0x80) == 0b11000001 == 0xC1

要测试该位,请使用&

(0b01000001 & 0x80) == 0
(0b11000001 & 0x80) != 0

要删除该位(在已设置的情况下)以取回原始第一个字节:

(0b11000001 & 0x7F) == 0b01000001 == 0x41 == 'A'

推荐阅读