对象向量上的所有位数组成员的OR运算

时间:2016-01-29 17:13:12

标签: c++ arrays bitmap bit-manipulation bitwise-operators

我有一个类Item,其中包含另一个类SubItem的向量。 SubItem类有一个存储subItem状态的位数组。子项类的每个状态都是独立于其他状态和其他子项设置/重置的。在事件驱动的环境中设置/重置状态。

我想在Item类中创建一个状态,它依赖于subItem状态的OR运算,即如果任何子项的状态,例如State1 = 1则是Item' s state1 = 1,如果所有子项state1 = 0,则item" state1 = 0。

复杂的是,Item类中的子项向量大小可能很大,我不希望循环遍历所有SubItems以在子项的状态发生变化时设置Item的状态。

一个选项是我在Item中创建一个int数组并保持一个给定状态设置为1的腿的数量,并且每当计数为0时我知道所有subItem的state1都设置为0所以我可以将Item的state1也设置为0.但是这不是空间效率。

我有另一个解决方案,但不知道如何在不循环子项的情况下执行此操作。 解决方案是Item也有一个bitarray。因此,为了确定ITem的state1 = 1,我得到所有分支的state1并且使用const unsigned int = 0(00000000)执行OR,如果此OR运算的结果为非零,那么我知道项目&# 39; s state1也是1,当结果为0时,item的state1也是0,但是我只是不知道如何在没有循环遍历所有子项时修改子项的状态。< / p>

//this enum refers to subitem's and item's states
    enum class flags 
    {
    state1, state2, state3, state4
    }   


    class SubItem
    {    
//The bitarray that stores states of subItem  
  unsigned int bitarray;
    }

    Class Item
    {
    std:vector<SubItem> m_arrSubItems;    
    Item(size_t size)
    {
    m_arrSubItems.Reserve(size)
    }
    /*The Item wants to create an array of states here.Each index of this array is an OR operation of the same state across all SubItems.*/
    }

1 个答案:

答案 0 :(得分:0)

  

一个选项是我在Item中创建一个int数组并保持计数方式   许多腿的给定状态设置为1,每当计数为0时   知道所有subItem的state1都设置为0所以我也可以设置Item的state1   然而,这不是空间效率。

节省空间(每个状态只需要添加一个计数器),但是您必须确保位设置操作只能通过设置该位的功能来完成,并且还可以更改相应的计数器,以保持一切同步。

否则,我看到的唯一其他选项是将计数委托给数据结构,但为此您必须更改位的存储方式。例如,对于每个状态使用两组整数,一组用于bit = 1的项目,另一组用于bit = 0的项目 - 但是使用该特定结构将使用(很多)更多内存并且可能也更慢。

  

我有另一个解决方案,但不知道如何在不循环子项的情况下执行此操作。解决方案是Item也有一个   bitarray。因此,为了确定ITem的state1 = 1,我获得了所有支路的状态1   如果结果为,则使用const unsigned int = 0(00000000)执行OR   这个OR运算是非零然后我知道项目的state1也是1   当结果为0时,项目的state1也为0,但我不是   知道怎么做而不用循环遍历所有子项目   subitem的状态被修改。

我不知道如何解决问题(x OR 0是alxays x,那么重点是什么?)。

PS并且在花费任何时间使代码更复杂之前,您应该对流程进行分析,以查看向量中的计数是否实际上是一个问题。它可能只占总处理时间的0.1%。