c++ BitArray 的实现

#ifndef _BIT_ARRAY_H
#define _BIT_ARRAY_H

#include <string.h>
#include <stdexcept>

namespace utils
{
    const char bit_one[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
    const char bit_zero[] = { 0xFE, 0xFC, 0xFB, 0xF7, 0xEF, 0xCF, 0xBF, 0x7F };

    class BitArray
    {
    public:
        BitArray();
        BitArray(size_t length);
        BitArray(const BitArray& other);
        BitArray(BitArray&& other)noexcept;
        ~BitArray();

        void setBit(size_t index);
        void setBit(int i, bool value);
        void clearBit(size_t index);
        void setAll(bool value);
        bool at(size_t index);

        const char* bits() const { return m_bitarray; };
        size_t size() { return m_length; }
        void resize(size_t size);

        bool operator [](size_t index);
        BitArray& operator = (const BitArray& other);
        BitArray& operator = (BitArray&& other)noexcept;
    private:
        size_t m_length;
        char* m_bitarray;

        size_t number_of_bytes(size_t size) {return ceil(m_length / 8.0);};
    };


    BitArray::BitArray()
    {
        m_length = 0;
        m_bitarray = nullptr;
    }

    BitArray::BitArray(size_t length)
    {
        m_length = length;
        size_t nb = number_of_bytes(length);
        m_bitarray = new char[nb];
    }

    BitArray::BitArray(const BitArray& other)
    {
        m_length = other.m_length;
        size_t nb = number_of_bytes(m_length);
        m_bitarray = new char[nb];

        memcpy(m_bitarray, other.m_bitarray, nb);
    }

    BitArray::BitArray(BitArray&& other) noexcept
    {
        m_length = other.m_length;
        m_bitarray = other.m_bitarray;
        other.m_length = 0;
        other.m_bitarray = nullptr;
    }

    BitArray::~BitArray()
    {
        if (m_bitarray){
            delete[]m_bitarray;
        }
    }

    void BitArray::setBit(size_t index)
    {
        if (index >= m_length){
            throw std::out_of_range("index out of range");
        }
        size_t offset = index >> 3;
        size_t bit = index & 0x07;

        m_bitarray[offset] |= bit_one[bit];
    }

    void BitArray::setBit(int i, bool value)
    {
        if (value)
            setBit(i);
        else
            clearBit(i);
    }

    void BitArray::clearBit(size_t index)
    {
        if (index >= m_length){
            throw std::out_of_range("index out of range");
        }
        size_t offset = index >> 3;
        size_t bit = index & 0x07;

        m_bitarray[offset] &= bit_zero[bit];
    }

    void BitArray::setAll(bool value)
    {
        size_t nb = number_of_bytes(m_length);
        for (size_t i = 0; i < nb; i++) {
            m_bitarray[i] = value ? 0xFF : 0x00;
        }
    }

    bool BitArray::at(size_t index)
    {
        if (index >= m_length){
            throw std::out_of_range("index out of range");
        }
        size_t offset = index >> 3;
        size_t bit = index & 0x07;
        return m_bitarray[offset] & bit_one[bit];
    }

    void BitArray::resize(size_t size)
    {    
        if (size <= 0)
            return;
        if (size == m_length)
            return;

        size_t length_old = m_length;
        char* bitarray_old = m_bitarray;
        size_t nb_old = number_of_bytes(length_old);

        m_length = size;
        size_t nb_new = number_of_bytes(m_length);
        m_bitarray = new char[nb_new];

        if (bitarray_old){
            memcpy(m_bitarray, bitarray_old, std::min(nb_new, nb_old));
            delete[] bitarray_old;
        }            
    }

    bool BitArray::operator [](size_t index)
    {
        return at(index);
    }

    BitArray& BitArray::operator = (const BitArray& other) {
        if (this == &other)
            return *this;

        if (m_bitarray)
        {
            delete[]m_bitarray;
            m_bitarray = nullptr;
        }

        m_length = other.m_length;
        size_t nb = number_of_bytes(m_length);
        m_bitarray = new char[nb];
         
        memcpy(m_bitarray, other.m_bitarray, nb);

        return *this;
    }

    BitArray& BitArray::operator = (BitArray&& other) noexcept {
        if (this == &other)
            return *this;

        m_length = other.m_length;
        m_bitarray = other.m_bitarray;
        other.m_length = 0;
        other.m_bitarray = nullptr;

        return *this;
    }
} 

#endif // !_BIT_ARRAY_H

BitArray是位数组,它提供对单个位的访问和设置

    utils::BitArray bit(100);
    bit.setAll(false);
    bit.setBit(23);
    bit.setBit(24,true);
    bit.clearBit(24);
    bool b = bit.at(24);
    for (int i = 0; i < bit.size(); ++i) {
        std::cout << bit[i] << std::endl;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值