⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qbitarray.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtCore module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qbitarray.h"#include <qdatastream.h>#include <qdebug.h>#include <string.h>/*!    \class QBitArray    \brief The QBitArray class provides an array of bits.    \ingroup tools    \ingroup shared    \reentrant    A QBitArray is an array that gives access to individual bits and    provides operators (\link operator&() AND\endlink, \link    operator|() OR\endlink, \link operator^() XOR\endlink, and \link    operator~() NOT\endlink) that work on entire arrays of bits. It    uses \l{implicit sharing} (copy-on-write) to reduce memory usage    and to avoid the needless copying of data.    The following code constructs a QBitArray containing 200 bits    initialized to false (0):    \code        QBitArray ba(200);    \endcode    To initialize the bits to true, either pass \c true as second    argument to the constructor, or call fill() later on.    QBitArray uses 0-based indexes, just like C++ arrays. To access    the bit at a particular index position, you can use operator[]().    On non-const bit arrays, operator[]() returns a reference to a    bit that can be used on the left side of an assignment. For    example:    \code        QBitArray ba;        ba.resize(3);        ba[0] = true;        ba[1] = false;        ba[2] = true;    \endcode    For technical reasons, it is more efficient to use testBit() and    setBit() to access bits in the array than operator[](). For    example:    \code        QBitArray ba(3);        ba.setBit(0, true);        ba.setBit(1, false);        ba.setBit(2, true);    \endcode    QBitArray supports \c{&} (\link operator&() AND\endlink), \c{|}    (\link operator|() OR\endlink), \c{^} (\link operator^()    XOR\endlink), \c{~} (\link operator~() NOT\endlink), as well as    \c{&=}, \c{|=}, and \c{^=}. These operators work in the same way    as the built-in C++ bitwise operators of the same name. For    example:    \code        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 ]    \endcode    For historical reasons, QBitArray distinguishes between a null    bit array and an empty bit array. A \e null bit array is a bit    array that is initialized using QBitArray's default constructor.    An \e empty bit array is any bit array with size 0. A null bit    array is always empty, but an empty bit array isn't necessarily    null:    \code        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    \endcode    All functions except isNull() treat null bit arrays the same as    empty bit arrays; for example, QBitArray() compares equal to    QBitArray(0). We recommend that you always use isEmpty() and    avoid isNull().    \sa QByteArray, QVector*//*! \fn QBitArray::QBitArray()    Constructs an empty bit array.    \sa isEmpty()*//*!    Constructs a bit array containing \a size bits. The bits are    initialized with \a value, which defaults to false (0).*/QBitArray::QBitArray(int size, bool value){    if (!size) {        d.resize(0);        return;    }    d.resize(1 + (size+7)/8);    uchar* c = reinterpret_cast<uchar*>(d.data());    memset(c, value ? 0xff : 0, d.size());    *c = d.size()*8 - size;    if (value && size && size % 8)        *(c+1+size/8) &= (1 << (size%8)) - 1;}/*! \fn int QBitArray::size() const    Returns the number of bits stored in the bit array.    \sa resize()*//*! \fn int QBitArray::count() const    Same as size().*//*!    If \a on is true, this function returns the number of    1-bits stored in the bit array; otherwise the number    of 0-bits is returned.*/int QBitArray::count(bool on) const{    int numBits = 0;    int len = size();#if 0    for (int i = 0; i < len; ++i)        numBits += testBit(i);#else    // See http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel    const quint8 *bits = reinterpret_cast<const quint8 *>(d.data()) + 1;    while (len >= 32) {        quint32 v = quint32(bits[0]) | (quint32(bits[1]) << 8) | (quint32(bits[2]) << 16) | (quint32(bits[3]) << 24);        quint32 c = ((v & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;        c += (((v & 0xfff000) >> 12) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;        c += ((v >> 24) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;        len -= 32;        bits += 4;        numBits += int(c);    }    while (len >= 24) {        quint32 v = quint32(bits[0]) | (quint32(bits[1]) << 8) | (quint32(bits[2]) << 16);        quint32 c =  ((v & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;        c += (((v & 0xfff000) >> 12) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;            len -= 24;        bits += 3;        numBits += int(c);    }    while (len >= 0) {        if (bits[len / 8] & (1 << ((len - 1) & 7)))            ++numBits;        --len;    }#endif    return on ? numBits : size() - numBits;}/*!    Resizes the bit array to \a size bits.    If \a size is greater than the current size, the bit array is    extended to make it \a size bits with the extra bits added to the    end. The new bits are initialized to false (0).    If \a size is less than the current size, bits are removed from    the end.    \sa size()*/void QBitArray::resize(int size){    if (!size) {        d.resize(0);    } else {        int s = d.size();        d.resize(1 + (size+7)/8);        uchar* c = reinterpret_cast<uchar*>(d.data());        if (size > (s << 3))            memset(c + s, 0, d.size() - s);        *c = d.size()*8 - size;    }}/*! \fn bool QBitArray::isEmpty() const    Returns true if this bit array has size 0; otherwise returns    false.    \sa size()*//*! \fn bool QBitArray::isNull() const    Returns true if this bit array is null; otherwise returns false.    Example:    \code        QBitArray().isNull();           // returns true        QBitArray(0).isNull();          // returns false        QBitArray(3).isNull();          // returns false    \endcode    Qt makes a distinction between null bit arrays and empty bit    arrays for historical reasons. For most applications, what    matters is whether or not a bit array contains any data,    and this can be determined using isEmpty().    \sa isEmpty()*//*! \fn bool QBitArray::fill(bool value, int size = -1)    Sets every bit in the bit array to \a value, returning true if successful;    otherwise returns false. If \a size is different from -1 (the default),    the bit array is resized to \a size beforehand.    Example:    \code        QBitArray ba(8);        ba.fill(true);        // ba: [ 1, 1, 1, 1, 1, 1, 1, 1 ]        ba.fill(false, 2);        // ba: [ 0, 0 ]    \endcode    \sa resize()*//*!    \overload    Sets bits at index positions \a begin up to and excluding \a end    to \a value.    \a begin and \a end must be a valid index position in the bit    array (i.e., 0 <= \a begin <= size() and 0 <= \a end <= size()).*/void QBitArray::fill(bool value, int begin, int end){    while (begin < end && begin & 0x7)        setBit(begin++, value);    int len = end - begin;    if (len <= 0)        return;    int s = len & ~0x7;    uchar *c = reinterpret_cast<uchar*>(d.data());    memset(c + (begin >> 3) + 1, value ? 0xff : 0, s >> 3);    begin += s;    while (begin < end)        setBit(begin++, value);}/*! \fn bool QBitArray::isDetached() const    \internal*//*! \fn void QBitArray::detach()    \internal*//*! \fn void QBitArray::clear()    Clears the contents of the bit array and makes it empty.    \sa resize(), isEmpty()*//*! \fn void QBitArray::truncate(int pos)    Truncates the bit array at index position \a pos.    If \a pos is beyond the end of the array, nothing happens.    \sa resize()*//*! \fn bool QBitArray::toggleBit(int i)    Inverts the value of the bit at index position \a i, returning the    previous value of that bit as either true (if it was set) or false (if    it was unset).    If the previous value was 0, the new value will be 1. If the    previous value was 1, the new value will be 0.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).    \sa setBit(), clearBit()*//*! \fn bool QBitArray::testBit(int i) const    Returns true if the bit at index position \a i is 1; otherwise    returns false.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).    \sa setBit(), clearBit()*//*! \fn bool QBitArray::setBit(int i)    Sets the bit at index position \a i to 1.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).    \sa clearBit(), toggleBit()*//*! \fn void QBitArray::setBit(int i, bool value)    \overload    Sets the bit at index position \a i to \a value.*//*! \fn void QBitArray::clearBit(int i)    Sets the bit at index position \a i to 0.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).    \sa setBit(), toggleBit()*//*! \fn bool QBitArray::at(int i) const    Returns the value of the bit at index position \a i.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).    \sa operator[]()*//*! \fn QBitRef QBitArray::operator[](int i)    Returns the bit at index position \a i as a modifiable reference.    \a i must be a valid index position in the bit array (i.e., 0 <=    \a i < size()).

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -