?? bitfield.cpp
字號:
#include "Bitfield.h"#include <stdlib.h>#include <string.h>#include <stdio.h>//using namespace std;size_t bitfield::nbytes = 0;size_t bitfield::nbits = 0;const unsigned char BIT_HEX[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };bitfield::bitfield(){ b = new unsigned char[nbytes]; memset(b, 0, nbytes); nset = 0;}bitfield::bitfield(size_t bits){ nset = 0; nbits = bits; nbytes = bits / 8 + (bits % 8 ? 1 : 0); b = new unsigned char[nbytes];}bitfield::~bitfield(){ delete b;}void bitfield::SetAll(){ nset = nbits; for (int i = 0; i < nbits / 8; i++) b[i] |= 0xff; for (int k = 0; k < (nbits % 8); k++) b[nbytes - 1] |= BIT_HEX[k];}void bitfield::Set(size_t idx){ if (idx >= nbits) return; if (!(b[idx / 8] & BIT_HEX[idx % 8])) { b[idx / 8] |= BIT_HEX[idx % 8]; nset++; }}void bitfield::UnSet(size_t idx){ if (idx >= nbits) return; if (b[idx / 8] & BIT_HEX[idx % 8]) { b[idx / 8] &= (~BIT_HEX[idx % 8]); nset--; }}int bitfield::IsSet(size_t idx) const{ if (idx >= nbits) return -1; return (b[idx / 8] & BIT_HEX[idx % 8]) ? 1 : 0;}void bitfield::Empty(){ nset = 0; memset(b, 0, nbytes);}void bitfield::Except(const bitfield & bf){ if (bf.IsEmpty()) return; if (bf.IsFull()) { Empty(); return; } unsigned char ch; for (int i = 0; i < nbytes; i++) { ch = b[i]; ch ^= bf.b[i]; b[i] &= ch; } ReCalculate();}void bitfield::ReCalculate(){ nset = 0; for (int i = 0; i < nbytes; i++) { unsigned char ch = b[i]; while (ch) { nset++; ch &= ch - 1; } }}void bitfield::printout(){ printf("%d\n", nset); for (int i = 0; i < nbytes; i++) printf("%x\n", b[i]);}void bitfield::And(const bitfield & bf){ for (int i = 0; i < nbytes; i++) b[i] &= bf.b[i]; ReCalculate();}void bitfield::Invert(){ for (int i = 0; i < nbits / 8; i++) b[i] = ~b[i]; for (int k = 0; k < nbits % 8; k++) { int n = (nbytes - 1) * 8 + k; if (IsSet(n)) UnSet(n); else Set(n); } ReCalculate();}/*int main(){ bitfield bf(51), bt; bt.Set(1); bt.Set(31); bf.SetAll(); bf.Except(bt); bf.printout(); bf.Invert(); bf.And(bt); bf.printout(); return 0;}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -