让我们假设我有一个包含7个元素的布尔数组,例如
boolean myArray = {1,0,1,1,1,0,1}
我要在位域中表示的该数组:
uint8 myBitfieldofmyArray;
重要的是,将数组的最后一个元素设置为myBitfieldofmyArray中的最高有效位。不考虑最低有效位(位0),默认情况下始终为0。
通过以下解决方案,将1.e元素设置为最高有效位:
uint8_t myBitfieldofmyArray= 0;
for (int i = 0; i < 7; i++) {
myBitfieldofmyArray|= myArray[i] ? 1 : 0;
myBitfieldofmyArray<<= 1;
}
如何进行调整以使最后一个元素设置为最高有效位?
以上解决方案来自:Pushing boolean values of an array to uint8 bitfield
您可以使用“反向循环”:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
int main() {
bool myArray[7] = {1, 0, 0, 1, 1, 0, 0};
uint8_t myBitfieldofmyArray= 0;
for (int i = 6; i >= 0; --i) {
myBitfieldofmyArray |= myArray[i];
myBitfieldofmyArray <<= 1;
}
printf("%d\n", myBitfieldofmyArray);
}
[bool
s取值为0或1,所以我认为三元数? 1 : 0
不必要。
好吧,如果您要从MSB开始存储位字段,则只需还原for(int i=7; i>=0; ++i)
之类的循环。
话虽这么说,您确定要使用位域而不是int / bool数组吗?。
如果您有256个字段,将它们存储在int / bool数组中将占用1KB,而32B带一个位字段。
因此,使用位域可获得不到1KB的空间,但是却失去了紧凑性,代码变得更加复杂,每次读/写都需要进行额外的计算才能正确设置/清除位,从而导致性能下降。
因此,除非您有充分的理由使用位域(例如通过网络发送它),否则绝对应避免使用它们。