QBitArray

一、描述

QBitArray 是位数组,它提供对单个位的访问并提供对整个位数组起作用的运算符(AND、OR、XOR 和 NOT)。 它使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。

以下代码构造了一个包含 200 位初始化为 false (0) 的 QBitArray:

 QBitArray ba(200);

要将位初始化为 true,请将 true 作为第二个参数传递给构造函数,或者稍后调用 fill()。

QBitArray 使用基于 0 的索引,就像 C++ 数组一样。 要访问特定索引位置的位,可以使用 operator[]()。

非常量位数组上,operator[]() 返回位的引用。例如:

 QBitArray ba(3);
 ba.setBit(0, true);
 ba.setBit(1, false);
 ba.setBit(2, true);

QBitArray 支持 & (AND)、| (OR)、^ (XOR)、~ (NOT) 、&=、|=、^=。 这些运算符的工作方式与同名的内置 C++ 按位运算符相同。 例如:

 QBitArray x(5);
 x.setBit(3, true); // x: [ 0, 0, 0, 1, 0 ]

 QBitArray y(5);
 y.setBit(4, true); // y: [ 0, 0, 0, 0, 1 ]

 x |= y; // x: [ 0, 0, 0, 1, 1 ]

二、成员函数

1、QBitArray(qsizetype size, bool value = false)

构造一个包含大小位的位数组。 这些位用 value 初始化,默认为 false (0)。

2、bool at(qsizetype i)

返回索引位置 i 处的位值。

3、void clearBit(qsizetype i)

将索引位置 i 处的位设置为 0。

4、qsizetype count(bool on)

如果 on 为真,则返回存储在位数组中的 1 位的数量。否则返回 0 位的数量。

5、bool fill(bool value, qsizetype size = -1)

将位数组中的每一位都设置为 value,如果成功则返回 true; 否则返回false。如果 size 不等于 -1,则位数组的大小会预先调整为 size。

 QBitArray ba(8);
 ba.fill(true); // ba: [ 1, 1, 1, 1, 1, 1, 1, 1 ]

 ba.fill(false, 2); // ba: [ 0, 0 ]

void fill(bool value, qsizetype begin, qsizetype end)

在索引位置设置位开始(但不包括)结束到值。

 QBitArray ba(4);
 ba.fill(true, 1, 2);            // ba: [ 0, 1, 0, 0 ]
 ba.fill(true, 1, 3);            // ba: [ 0, 1, 1, 0 ]
 ba.fill(true, 1, 4);            // ba: [ 0, 1, 1, 1 ]

6、bool isEmpty() \ bool isNull()

 QBitArray().isNull();           // returns true
 QBitArray().isEmpty();          // returns true

 QBitArray(0).isNull();          // returns false
 QBitArray(0).isEmpty();         // returns true

 QBitArray(3).isNull();          // returns false
 QBitArray(3).isEmpty();         // returns false

应尽量用isEmpty()。

7、void resize(qsizetype 大小)

调整位数组大小。

如果 size 大于当前大小,则扩展位数组以使其大小位,并在末尾添加额外的位。 新位被初始化为false (0)。

如果 size 小于当前大小,则从末尾删除位。

8、void setBit(qsizetype i)

将索引位置 i 处的位设置为 1。

9、void setBit(qsizetype i, bool value)

将索引位置 i 处的位设置为 value。

10、bool testBit(qsizetype i) 

如果索引位置 i 处的位为 1,则返回 true。否则返回false。

11、quint32 toUInt32(QSysInfo::Endian endianness, bool *ok = nullptr)

位数组转int类型。如果 ok 不是空指针,并且数组超过 32 位,则 ok 设置为 false 并且此函数返回零;否则,它被设置为真。

参数1决定了转换的方向。

    QBitArray x(32);
//    x.setBit(31, true);
//    x.setBit(30, true);
//    qDebug()<<x.toUInt32(QSysInfo::BigEndian);//3

    x.setBit(0, true);
    x.setBit(1, true);
    qDebug()<<x.toUInt32(QSysInfo::LittleEndian);//3

 12、bool toggleBit(qsizetype i)

反转索引位置 i 处的位值,返回操作是否成功。

如果先前的值为 0,则新值将为 1。如果先前的值为 1,则新值将为 0。

13、void truncate(qsizetype pos)

在索引位置 pos 处截断位数组。如果 pos 超出数组的末尾,则什么也不会发生。 

三、运算符操作

位数组之间进行位数组操作时,结果具有两个位数组中最长的长度,任何丢失的位(如果一个数组比另一个短)都被视为 0。

1、QBitArray & operator&=(const QBitArray &other)

在当前位数组中的所有位与其他位之间执行 AND 运算。将结果分配给当前位数组,并返回对它的引用。

 QBitArray a(3);
 QBitArray b(2);
 a[0] = 1; a[1] = 0; a[2] = 1;   // a: [ 1, 0, 1 ]
 b[0] = 1; b[1] = 1;             // b: [ 1, 1 ]
 a &= b;                         // a: [ 1, 0, 0 ]

2、bool operator==(const QBitArray &other)

3、QBitRef operator[](qsizetype i)

     bool operator[](qsizetype i) 

返回索引位置 i 处位的引用。

 QBitArray a(3);
 a[0] = false;
 a[1] = true;
 a[2] = a[0] ^ a[1];

4、QBitArray & operator^=(const QBitArray &other)

在当前位数组中的所有位与其他位之间执行 XOR 运算。 将结果分配给当前位数组,并返回对它的引用。

 QBitArray a(3);
 QBitArray b(2);
 a[0] = 1; a[1] = 0; a[2] = 1;   // a: [ 1, 0, 1 ]
 b[0] = 1; b[1] = 1;             // b: [ 1, 1 ]
 a ^= b;                         // a: [ 0, 1, 1 ]

5、QBitArray & operator|=(const QBitArray &other)

或操作。

6、QBitArray operator~()

非操作。

四、相关非成员

1、QBitArray operator&(const QBitArray &a1, const QBitArray &a2)

返回一个位数组,它是位数组 a1 和 a2 的 AND。

 QBitArray a(3);
 QBitArray b(2);
 QBitArray c;
 a[0] = 1; a[1] = 0; a[2] = 1;   // a: [ 1, 0, 1 ]
 b[0] = 1; b[1] = 1;             // b: [ 1, 1 ]
 c = a & b;                      // c: [ 1, 0, 0 ]

2、QBitArray operator^(const QBitArray &a1, const QBitArray &a2)

返回一个位数组,它是位数组 a1 和 a2 的 XOR。

 QBitArray a(3);
 QBitArray b(2);
 QBitArray c;
 a[0] = 1; a[1] = 0; a[2] = 1;   // a: [ 1, 0, 1 ]
 b[0] = 1; b[1] = 1;             // b: [ 1, 1 ]
 c = a ^ b;                      // c: [ 0, 1, 1 ]

3、QBitArray operator|(const QBitArray &a1, const QBitArray &a2)

返回一个位数组,它是位数组 a1 和 a2 的 OR。

上一篇:基础数组入门


下一篇:字符串转换