假设我有一个布尔数组,其中包含 7 个元素,例如
boolean myArray = {1,0,1,1,1,0,1}
我想在位域中表示的这个数组:
uint8 myBitfieldofmyArray;
重要的是,数组的最后一个元素被设置为myBitfieldofmyArray中的最高有效位。 不考虑最低有效位(位 0(,默认情况下始终为 0。
使用以下解决方案,1.element 设置为最高有效位:
uint8_t myBitfieldofmyArray= 0;
for (int i = 0; i < 7; i++) {
myBitfieldofmyArray|= myArray[i] ? 1 : 0;
myBitfieldofmyArray<<= 1;
}
如何调整它以使最后一个元素设置为最高有效位?
上述解决方案取自: 将数组的布尔值推送到 uint8 位域
您可以使用"反向循环":
#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("%dn", myBitfieldofmyArray);
}
bool
的计算结果为 0 或 1,所以我认为三元? 1 : 0
是不必要的。
好吧,如果你想从MSB开始存储你的位域,你可以将循环更改为:
for(int i=0; i<7; ++i)
myBitfieldofmyArray |= (myArray[i]<<(7-i))
话虽如此,您确定要需要位字段而不是整数/布尔数组吗?
如果您有 256 个字段将它们存储在 int/bool 数组中,则需要 1KB,而 32B 的位字段将占用 1KB。
因此,通过使用位域获得的收益不到 1KB,但您失去了紧凑性,您的代码变得更加复杂,并且每次读/写都需要额外的计算才能获得正确的位来设置/清除,因此您会失去性能(您可以检查汇编代码(。
因此,除非您有充分的理由使用位域(例如通过网络发送(,否则您绝对应该避免使用它们。
一种简单的方法是使用两个计数器循环将位从数组从array[0]
开始移动到uint8
中的位,从 MSB 开始,并在递减位位置的同时递增数组索引,例如
uint8_t myBitfieldofmyArray = 0, i = 7, j = 0;
while (i--)
myBitfieldofmyArray |= myArray[j++] << (i + 1);
结果
myBitfieldofmyArray
的位子是10111010