www.pudn.com > BV.rar > bitvect.cpp


#include"bitvect.h" 
#include 
#include 
#include 
#include 
#include  //CHAR_BIT = 8 
 
//const unsigned char highbit = 1 << (CHAR_BIT - 1); 
unsigned char highbit = 1 << (CHAR_BIT - 1); 
BitVector::BitVector() 
{ 
	numBytes = 0; 
	Bits = 0; 
	bytes = 0; 
} 
 
BitVector::BitVector(unsigned char* init, int size) 
{ 
	numBytes = size; 
	Bits = numBytes * CHAR_BIT; 
	bytes = (unsigned char*)calloc(numBytes, 1); 
	assert(bytes); 
	 
	if(init == 0) 
		return; 
	 
	for(int index = 0; index < numBytes; index++){ 
		for(int offset = 0; offset < CHAR_BIT; offset++){			 
			if(init[index] & (highbit>>offset)) 
				set(index * CHAR_BIT + 	offset); 
		} 
	} 
} 
 
BitVector::BitVector(char* binary) 
{ 
	Bits = strlen(binary); 
	numBytes = Bits / CHAR_BIT; 
	 
	if(Bits % CHAR_BIT) 
		numBytes++; 
	bytes = (unsigned char*)calloc(numBytes, 1); 
	assert(bytes); 
	for(int i = 0; i < Bits; i++) 
		if(binary[i] == '1') 
			set(i); 
} 
 
BitVector::~BitVector() 
{ 
	free(bytes); 
}	 
 
void BitVector::set(int bit) 
{ 
	assert(bit >= 0 && bit < Bits); 
	int index = bit / CHAR_BIT; 
	int offset = bit % CHAR_BIT; 
	unsigned char mask = (1 << offset); 
	bytes[index] |= mask; 
} 
 
int BitVector::read(int bit) 
{ 
	assert(bit >= 0 && bit < Bits); 
	int index = bit / CHAR_BIT; 
	int offset = bit % CHAR_BIT; 
	unsigned char mask = (1 << offset); 
	 
	return bytes[index] & mask; 
} 
 
void BitVector::clear(int bit) 
{ 
	assert(bit >= 0 && bit < Bits); 
	int index = bit / CHAR_BIT; 
	int offset = bit % CHAR_BIT; 
	unsigned char mask = ~(1 << offset); 
	bytes[index] &= mask; 
} 
 
int BitVector::bits() 
{ 
	return Bits; 
} 
 
void BitVector::bits(int size) 
{ 
	int oldsize = Bits; 
	Bits = size; 
	numBytes = Bits / CHAR_BIT; 
	 
	if(Bits % CHAR_BIT) 
		numBytes++; 
	void* v = realloc(bytes, numBytes); 
	assert(v); 
	bytes = (unsigned char*)v; 
	for(int i = oldsize; i < Bits; i++) 
		clear(i); 
} 
 
void BitVector::print(const char* msg) 
{ 
	puts(msg); 
	for(int i = 0; i < Bits; i++){ 
		if(read(i)) 
			putchar('1'); 
		else 
			putchar('0'); 
		 
		if((i + 1) % CHAR_BIT == 0) 
			putchar(' '); 
	} 
	 
	putchar('\n'); 
}