比如写 1234 ,字节序: 1234/8 = 154; 位序: 1234 &0b111 = 2 ,那么 1234 放在 bit 的下标 154 字节处,把该字节的 2 号位( 0~7)置为 1
字节位置: int nBytePos =1234/8 = 154;
位位置: int nBitPos = 1234 & 7 = 2;
// 把数组的 154 字节的 2 位置为 1 unsigned short val = 1<<nBitPos; bit[nBytePos] = bit[nBytePos] |val; // 写入 1234 得到arrBit[154]=0b00000100
再比如写入 1236 ,
字节位置: int nBytePos =1236/8 = 154;
位位置: int nBitPos = 1236 & 7 = 4
// / 把数组的 154 字节的 4 位置为 1 val = 1<<nBitPos; arrBit[nBytePos] = arrBit[nBytePos] |val; // 再写入 1236 得到arrBit[154]=0b00010100函数实现:
#define SHIFT 5 #define MAXLINE 32 #define MASK 0x1F void setbit(int *bitmap, int i){ bitmap[i >> SHIFT] |= (1 << (i & MASK)); }
bool getbit(int *bitmap1, int i){ return bitmap1[i >> SHIFT] & (1 << (i & MASK)); }
要求在http://blog.csdn.net/w397090770/article/details/7388319里面
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> #define SHIFT 5 #define MAXLINE 32 #define MASK 0x1F using namespace std; // w397090770 // [email protected] // 2012.11.29 void setbit(int *bitmap, int i){ bitmap[i >> SHIFT] |= (1 << (i & MASK)); } bool getbit(int *bitmap1, int i){ return bitmap1[i >> SHIFT] & (1 << (i & MASK)); } size_t getFileSize(ifstream &in, size_t &size){ in.seekg(0, ios::end); size = in.tellg(); in.seekg(0, ios::beg); return size; } char * fillBuf(const char *filename){ size_t size = 0; ifstream in(filename); if(in.fail()){ cerr<< "open " << filename << " failed!" << endl; exit(1); } getFileSize(in, size); char *buf = (char *)malloc(sizeof(char) * size + 1); if(buf == NULL){ cerr << "malloc buf error!" << endl; exit(1); } in.read(buf, size); in.close(); buf[size] = '\0'; return buf; } void setBitMask(const char *filename, int *bit){ char *buf, *temp; temp = buf = fillBuf(filename); char *p = new char[11]; int len = 0; while(*temp){ if(*temp == '\n'){ p[len] = '\0'; len = 0; //cout<<p<<endl; setbit(bit, atoi(p)); }else{ p[len++] = *temp; } temp++; } delete buf; } void compareBit(const char *filename, int *bit, vector<int> &result){ char *buf, *temp; temp = buf = fillBuf(filename); char *p = new char[11]; int len = 0; while(*temp){ if(*temp == '\n'){ p[len] = '\0'; len = 0; if(getbit(bit, atoi(p))){ result.push_back(atoi(p)); } }else{ p[len++] = *temp; } temp++; } delete buf; } int main(){ vector<int> result; unsigned int MAX = (unsigned int)(1 << 31); unsigned int size = MAX >> 5; int *bit1; bit1 = (int *)malloc(sizeof(int) * (size + 1)); if(bit1 == NULL){ cerr<<"Malloc bit1 error!"<<endl; exit(1); } memset(bit1, 0, size + 1); setBitMask("file1", bit1); compareBit("file2", bit1, result); delete bit1; cout<<result.size(); sort(result.begin(), result.end()); vector< int >::iterator it = unique(result.begin(), result.end()); ofstream of("result"); ostream_iterator<int> output(of, "\n"); copy(result.begin(), it, output); return 0; }