如何使这些成员元素适合3字节
How to make these member elements fit in 3 bytes?
我有一个结构体,它的长度不应该超过14个字节,到目前为止我还有3个字节(11个字节已经被占用)。我需要添加3个成员大小,取值范围为40 ~ 8188Id1,取值范围是1 ~ 257Id2,取值范围为1 ~ 254这里是
uint16_t size:13;
uint16_t id1:9;
uint8_t id2:8;
另一方面,这将导致我多余6位。还有什么方法能让这3个成员在3个字节内?Id1和Id2应该总是在一起
这不可能。
从逻辑上讲,您拥有的可能值的数量是:
- 8148不同的
size
s - 256个不同的
id1
s - 253个不同
id2
s
这使得8148*256*253 = 527729664个不同的值组合。2的24次方,也就是三个字节的所有可能性,只有16777216。即使你把这三个数字加在一起,你也做不到。
可以按原样装入29位。或者您可以进一步限制值的范围。
如果有关于协方差的额外信息-例如,"当id2
为1时,size
总是大于500",您可以使用它来压缩更多的内容。
如果结构体的总大小为14字节,则有两种可能:
-
alignof(type) == 2
-
alignof(type) == 4
或alignof(type) == 8
这取决于前11个字节中声明的成员。它不能对齐到1字节,因为你已经有了一个13位的成员。
在第一种情况下,你找不到解决问题的方法。不仅因为13+9+8 > 3*8
所以没有空间(并且没有解决这个问题的方法,请参阅香农的第一个定理)。但也因为如果结构体在2字节边界上对齐,你就不能有一个跨越边界的位域(这是id1
的情况,因为3位将驻留在2字节组中,其余的在其他组中)。
如果对齐是4/8字节,没有问题,因为已经有2个字节用于填充(因此结构体的有效大小为16字节),并且您有足够的空闲
是一个选项,做范围切换的情况下的声明?
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么数组(字符串类型)的大小是 24 字节,带有单个空格元素
- C++递减单字节(易失性)数组的元素不是原子!为什么?(还有:如何在Atmel AVR mcus/Arduino中强制原
- 从 5x10^8 个不同的数组元素读取,每次读取 4 个字节
- 填充字节发现以及数组初始值设定项中多余元素的常见和特殊编译器行为
- 将4字节整数放入vector的前4个字符元素中
- 如何使这些成员元素适合3字节
- Cuda有效地从字节数组复制到不同大小的共享内存元素
- c++到c#:有3个元素的字节指针数组等于什么?