[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);}
- [C++]bitset用int数组实现
- C++: 模拟实现类bitset
- C++Simplify05-标准库bitset和数组
- C++实现动态int数组
- C++int数组和数组指针
- bitset应用——用string数组对bitset数组赋值
- 【c/c++】bitset
- C#_二位数组 int[, ]
- C语言程序设计:指针数组 int *p[]
- C语言 获取int数组长度
- c语言用rand() 函数,实现random(int m)
- C++/STL Bitset
- [C++]bitset特殊用法
- C++/STL bitset
- C++/STL bitset
- 【C++】bitset的用法
- [C++]bitset类用法
- C++bitset学习小记
- 一个像素转换工具类的实现——dp,px,sp之间的相互转换
- spring中的cron表达式
- 关于typedef的用法总结
- 使用Euclidean法求乘法逆
- 空心三角形
- [C++]bitset用int数组实现
- leetcode 337. House Robber III-动态规划|Java|Python简洁高效
- CSS3新增的有关背景与边框的属性
- JVM之字节码指令简介
- 基于DNS的负载均衡
- 第二天复习多线程的笔记整理
- pku1085 Triangle War 完全极大极小搜索+状压DP
- CSS样式的优先级
- js简单交互动画,运动吧