C语言 将布尔数组的最后一个元素设置为位域中的最高有效位



假设我有一个布尔数组,其中包含 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

最新更新