[C++]bitset用int数组实现

来源:互联网 发布:12377网络举报有用吗 编辑:程序博客网 时间:2024/05/22 13:57

这并不是真正的bitset,只是用一些简单的c++知识来模仿bitset。

define N 5

const int max_length = 32 * N;//这个数字共有32*5位。从第0位到第max_length-1位,第0位是最低位。
class bitset {
private:
int a[N];//一个int32位,所以只用开N个int
public:
bitset();//默认构造函数,所有位初始化为0
void set(int pos);//把位置pos设置成1
void reset(int pos);//将位置pos设置成0
int count() const;//输出一共有多少个为1的位
bool test(int pos) const;//位置pos是否是1
bool any() const;//是否有是1的位
bool none() const;//是否没有是1的位
bool all() const;//是否所有位都是1

//位运算部分和普通数字的位运算相同。
bitset& operator&= (const bitset& b);
bitset& operator|= (const bitset& b);
bitset& operator^= (const bitset& b);
bitset& operator= (const bitset& b);
bitset& operator <<= (int pos);
bitset& operator >>= (int pos);
bitset operator~() const;
bitset operator&(const bitset& b) const;
bitset operator|(const bitset& b) const;
bitset operator^(const bitset& b) const;
bitset operator<<(int pos) const;
bitset operator>>(int pos) const;
bool operator== (const bitset& b) const;
bool operator!= (const bitset& b) const;
bool operator[] (int pos) const;//返回位置pos是不是1.

//输出部分已经实现
friend std::ostream& operator << (std::ostream& os, const bitset& s) {
for (int i = N-1; i >= 0; i–) {
for (int j = 31; j >= 0; j–) {
if (s.a[i] & (1 << j)) os << 1;
else os << 0;
}
}
return os;
}
};

练习点:只要定义少数关键的函数或操作符,就可以把其他函数和操作符实现。一定要学会用如何减少代码量。

#include<iostream>#include"Bitset.h"using namespace std;int main() {    bitset a, b;    int n, m, q;    cin >> n >> m >> q;    for (int i = 0; i < n; i++) {        int x;        cin >> x;        a.set(x);    }    cout << "a.count() is " << a.count() << "\n";    cout << "a.test(5) is " << (a.test(5) ? "true" : "false") << "\n";    cout << "a.any() is " << (a.any() ? "true" : "false") << "\n";    cout << "a.none() is " << (a.none() ? "true" : "false") << "\n";    cout << "a.all() is " << (a.all() ? "true" : "false") << "\n";    b = ~b;    for (int i = 0; i < m; i++) {        int x;        cin >> x;        b.reset(x);    }    cout << a << "\n";    cout << b << "\n";    if (a == b) {        cout << "hello\n";    }    if (a != b) {        cout << "world\n";    }    bitset c;    // test &    c = a;    c &= b;    cout << c << "\n";    c = a & b;    cout << c << "\n";    // test |    c = a;    c |= b;    cout << c << "\n";    c = a | b;    cout << c << "\n";    // test ^    c = a;    c ^= b;    cout << c << "\n";    c = a ^ b;    cout << c << "\n";    // test <<    c = a;    c <<= 2;    cout << c << "\n";    c = a << 2;    cout << c << "\n";    // test >>    c = b;    c >>= 2;    cout << c << "\n";    c = b >> 2;    cout << c << "\n";    // test []    for (int i = 0; i < q; i++) {        int x;        cin >> x;        if (a[i])            cout << "Yes\n";        else            cout << "No\n";    }}#ifndef BITSET_H#define BITSET_H#include<iostream>#define N 5const int max_length = 32 * N;class bitset {    private:        int a[N];    public:        bitset();        void set(int pos);        void reset(int pos);        int count() const;        bool test(int pos) const;        bool any() const;        bool none() const;        bool all() const;        bitset& operator&= (const bitset& b);        bitset& operator|= (const bitset& b);        bitset& operator^= (const bitset& b);        bitset& operator= (const bitset& b);        bitset& operator <<= (int pos);        bitset& operator >>= (int pos);        bitset operator~() const;        bitset operator&(const bitset& b) const;        bitset operator|(const bitset& b) const;        bitset operator^(const bitset& b) const;        bitset operator<<(int pos) const;        bitset operator>>(int pos) const;        bool operator== (const bitset& b) const;        bool operator!= (const bitset& b) const;        bool operator[] (int pos) const;        friend std::ostream& operator << (std::ostream& os, const bitset& s) {            for (int i = N-1; i >= 0; i--) {                for (int j = 31; j >= 0; j--) {                    if (s.a[i] & (1 << j)) os << 1;                    else os << 0;                }            }            return os;        }};#endif#include "Bitset.h"#include <string.h>bitset::bitset() {    memset(a, 0, sizeof(a));}bool bitset::test(int pos) const {    int x = pos / 32;    if (a[x] & (1 << (pos % 32))) {        return true;    } else {        return false;    }}void bitset::set(int pos) {    int x = pos / 32;    if (!test(pos)) {        a[x] += 1 << (pos % 32);    }}void bitset::reset(int pos) {    int x = pos / 32;    if (test(pos)) {        a[x] -= 1 << (pos % 32);    }}int bitset::count() const {    int sum = 0;    for (int i = 0; i != 160; i++) {        if (test(i)) {            sum++;        }    }    return sum;}bool bitset::any() const {    for (int i = 0; i != 160; i++) {        if (test(i)) {            return true;        }    }    return false;}bool bitset::none() const {    return !any();}bool bitset::all() const {    for (int i = 0; i != 160; i++) {        if (!test(i)) {            return false;        }    }    return true;}bitset& bitset::operator&=(const bitset &b) {    for (int i = 0; i != 160; i++) {        if (test(i) && b.test(i)) {            set(i);        } else {            reset(i);        }    }    return *this;}bitset& bitset::operator|=(const bitset &b) {    for (int i = 0; i != 160; i++) {        if (test(i) || b.test(i)) {            set(i);        } else {            reset(i);        }    }    return *this;}bitset& bitset::operator^=(const bitset &b) {    for (int i = 0; i != 160; i++) {        if ((test(i) && !b.test(i)) || (!test(i) && b.test(i))) {            set(i);        } else {            reset(i);        }    }    return *this;}bitset& bitset::operator=(const bitset &b) {    for (int i = 0; i != 160; i++) {        if (b.test(i)) {            set(i);        } else {            reset(i);        }    }    return *this;}bool bitset::operator[](int pos) const {    if (test(pos)) {        return true;    } else {        return false;    }}bitset& bitset::operator <<= (int pos) {    bitset temp(*this);    memset(a, 0, sizeof(a));    for (int i = 0; i != 160 - pos; i++) {        if (temp.test(i)) {            set(i + pos);        } else {            reset(i + pos);        }    }    return *this;}bitset& bitset::operator>>=(int pos) {    bitset temp(*this);    memset(a, 0, sizeof(a));    for (int i = 0; i != 160; i++) {        if (temp.test(i)) {            set((i - pos) % 159);        } else {            reset((i - pos) % 159);        }    }    for (int i = 0; i != pos; i++) {        set(159 - i);    }    return *this;}bitset bitset::operator~() const {    bitset temp;    memset(temp.a, 0, sizeof(temp.a));    for (int i = 0; i != 160; i++) {        if (test(i)) {            temp.reset(i);        } else {            temp.set(i);        }    }    return temp;}bitset bitset::operator&(const bitset& b) const {    bitset answer;    for (int i = 0; i != 160; i++) {        if (test(i) && b.test(i)) {            answer.set(i);        } else {            answer.reset(i);        }    }    return answer;}bitset bitset::operator|(const bitset& b) const {    bitset answer;    for (int i = 0; i != 160; i++) {        if (test(i) || b.test(i)) {            answer.set(i);        } else {            answer.reset(i);        }    }    return answer;}bitset bitset::operator^(const bitset& b) const {    bitset answer;    for (int i = 0; i != 160; i++) {        if ((test(i) && !b.test(i)) || (!test(i) && b.test(i))) {            answer.set(i);        } else {            answer.reset(i);        }    }    return answer;}bitset bitset::operator<<(int pos) const {    bitset temp;    for (int i = 0; i != 160; i++) {        if (test(i)) {            temp.set(i + pos);        } else {            temp.reset(i + pos);        }    }    return temp;}bitset bitset::operator>>(int pos) const {    bitset temp;    for (int i = 0; i != 160; i++) {        if (test(i)) {            temp.set((i - pos) % 159);        } else {            temp.reset((i - pos) % 159);        }    }    for (int i = 0; i != pos; i++) {        temp.set(159 - i);    }    return temp;}bool bitset::operator == (const bitset& b) const {    for (int i = 0; i != 160; i++) {        if (test(i) != b.test(i)) {            return false;        }    }    return true;}bool bitset::operator!= (const bitset& b) const {    return !(*this == b);} 

答案:

#include"Bitset.h"bitset::bitset() {    for (int i = 0; i < N; i++) a[i] = 0;}void bitset::set(int pos) {    int x = pos / 32;    int y = pos % 32;    a[x] |= 1 << y;}void bitset::reset(int pos) {    int x = pos / 32;    int y = pos % 32;    a[x] &= ~(1 << y);}int bitset::count() const {    int sum = 0;    for (int i = 0; i < N; i++) {        for (int j = 0; j < 32; j++) {            if (a[i] & (1 << j)) sum++;        }    }    return sum;}bool bitset::test(int pos) const {    int x = pos / 32;    int y = pos % 32;    return (a[x] & (1 << y));}bool bitset::any() const {    return count() > 0;}bool bitset::none() const {    return count() == 0;}bool bitset::all() const {    return count() == max_length;}bitset& bitset::operator&= (const bitset& b) {    for (int i = 0; i < N; i++) a[i] &= b.a[i];    return *this;}bitset& bitset::operator|= (const bitset& b) {    for (int i = 0; i < N; i++) a[i] |= b.a[i];    return *this;}bitset& bitset::operator^= (const bitset& b) {    for (int i = 0; i < N; i++) a[i] ^= b.a[i];    return *this;}bitset& bitset::operator <<= (int pos) {    while (pos--) {        for (int i = N-1; i >= 0; i--) {            if (i == 0) {                a[i] <<= 1;                continue;            }            a[i] <<= 1;            if (a[i-1] & (1 << 31))                a[i] |= 1;            else                a[i] &= ~1;        }    }    return *this;}bitset& bitset::operator>>= (int pos) {    while (pos--) {        for (int i = 0; i < N; i++) {            if (i == N-1) {                a[i] >>= 1;                continue;            }            a[i] >>= 1;            if (a[i+1] & 1)                a[i] |= 1 << 31;            else                a[i] &= ~(1 << 31);        }    }    return *this;}bitset& bitset::operator= (const bitset& b) {    for (int i = 0; i < N; i++) a[i] = b.a[i];    return *this;}bitset bitset::operator~() const {    bitset s;    for (int i = 0; i < N; i++) s.a[i] = ~a[i];    return s;}bitset bitset::operator& (const bitset& b) const {    bitset s;    s = *this;    return s &= b;}bitset bitset::operator| (const bitset& b) const {    bitset s;    s = *this;    return s |= b;}bitset bitset::operator^ (const bitset& b) const {    bitset s;    s = *this;    return s ^= b;}bitset bitset::operator << (int pos) const {    bitset s;    s = *this;    return s <<= pos;}bitset bitset::operator >> (int pos) const {    bitset s;    s = *this;    return s >>= pos;}bool bitset::operator== (const bitset& b) const {    for (int i = 0; i < N; i++)        if (a[i] != b.a[i]) return false;    return true;}bool bitset::operator!= (const bitset& b) const {    for (int i = 0; i < N; i++)        if (a[i] != b.a[i]) return true;    return false;}bool bitset::operator[] (int pos) const {    int x = pos / 32;    int y = pos % 32;    return a[x] & (1 << y);}
1 0
原创粉丝点击