|
[code:1]#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "bitvect.h"
#include <limits.h>
const 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;
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');
}
//bitvect.cpp
[/code:1] |
|