⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitvect.cpp

📁 C++编程思想例子程序(位容器)
💻 CPP
字号:
#include"bitvect.h"
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>  //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');
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -