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

问题描述 投票:0回答:1

让我们假设我有一个包含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

c bit-fields
1个回答
0
投票

您可以使用“反向循环”:

#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不必要。


0
投票

好吧,如果您要从MSB开始存储位字段,则只需还原for(int i=7; i>=0; ++i)之类的循环。

话虽这么说,您确定要使用位域而不是int / bool数组吗?。

如果您有256个字段,将它们存储在int / bool数组中将占用1KB,而32B带一个位字段。

因此,使用位域可获得不到1KB的空间,但是却失去了紧凑性,代码变得更加复杂,每次读/写都需要进行额外的计算才能正确设置/清除位,从而导致性能下降。

因此,除非您有充分的理由使用位域(例如通过网络发送它),否则绝对应避免使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.