【问题标题】:Set Last Element of boolean array to as Most Significant Bit within an Bitfield将布尔数组的最后一个元素设置为位域中的最高有效位
【发布时间】:2019-11-29 08:47:18
【问题描述】:

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

如何调整它以将最后一个元素设置为最高有效位?

上述解决方案取自: Pushing boolean values of an array to uint8 bitfield

【问题讨论】:

    标签: c bit-fields


    【解决方案1】:

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

    #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);    
    }
    

    bools 评估为 0 或 1,所以我认为三元 ? 1 : 0 没有必要。

    【讨论】:

      【解决方案2】:

      好吧,如果您想从 MSB 开始存储位域,您可以将循环更改为:

      for(int i=0; i<7; ++i) 
         myBitfieldofmyArray |= (myArray[i]<<(7-i))
      
      

      话虽如此,您确定需要位域而不是 int/bool 数组吗?

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

      因此,通过使用位域,您获得的空间小于 1KB,但您会失去紧凑性,您的代码会变得更加复杂,并且每次读/写都需要额外的计算才能设置/清除正确的位,因此您会失去性能(您可以检查程序集代码)。

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

      【讨论】:

        【解决方案3】:

        一种简单的方法是使用两个计数器循环将数组中的位从array[0] 开始移动到uint8 中的位,从 MSB 开始,并在减少位位置的同时增加数组索引,例如

            uint8_t myBitfieldofmyArray = 0, i = 7, j = 0;
        
            while (i--)
                myBitfieldofmyArray |= myArray[j++] << (i + 1);
        

        结果

        myBitfieldofmyArray 的位是10111010

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 2011-05-05
          • 1970-01-01
          • 2015-09-22
          • 2022-01-12
          • 2010-10-19
          • 1970-01-01
          相关资源
          最近更新 更多