一、描述
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。