我正在尝试将 16 个无符号值填充到 8 个字节(64 位)中,并使用类似数组的语法访问它们。
“数组”中的每个条目都是一个半字节 - 4 位长。(我计划存储的值永远不会大于 15)。
我的第一次尝试是这样的:
int main(int argc, char* argv[]) {
union nibbles_array {
uint64_t as_long;
struct inner_array {
unsigned entry0 : 4;
unsigned entry1 : 4;
unsigned entry2 : 4;
unsigned entry3 : 4;
unsigned entry4 : 4;
unsigned entry5 : 4;
unsigned entry6 : 4;
unsigned entry7 : 4;
unsigned entry8 : 4;
unsigned entry9 : 4;
unsigned entry10 : 4;
unsigned entry11 : 4;
unsigned entry12 : 4;
unsigned entry13 : 4;
unsigned entry14 : 4;
unsigned entry15 : 4;
} as_array;
} array;
array.as_long = 0x0123456789abcdef;
printf("%d \n", array.as_array.entry0);
printf("%d \n", array.as_array.entry1);
printf("%d \n", array.as_array.entry2);
printf("%d \n", array.as_array.entry3);
printf("%d \n", array.as_array.entry4);
return 0;
}
这种实现产生了两个问题:第一个是值以相反的顺序存储。当然,我可以以相反的顺序分配值以获得所需的结果:array.as_long = 0xfedcba9876543210
,但我希望这段代码是可移植的,而不是依赖于字节序的。第二个是我无法以类似数组的语法访问带有索引的半字节。
第二次尝试是这样的:
int main(int argc, char* argv[]) {
uint64_t pseudo_array = 0x0123456789abcdef;
#define Array(i) (unsigned)((pseudo_array & (0xfUL << i)) >> i)
int i;
for (i = 0; i < 16; ++i) {
printf("%d ", Array(i));
}
printf("\n");
return 0;
}
以上可以解决第二个问题(类数组语法);现在我可以使用索引访问“元素”,但是字节顺序问题仍然存在,而且这会产生错误的输出:
15 7 11 13 14 15 7 11 13 6 3 9 12 14 15 7
- 为什么上面会产生这个输出?
- 您能否建议既允许我通过索引访问“数组”又可以解决字节顺序问题的实现?