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

📄 bitstring.h

📁 3D游戏开发需要用到BSP树来经行场景渲染的管理。本代码包含完整的BSP及文件生成实现
💻 H
字号:
#pragma once

#include <string.h>

#define BIT2BYTE(bitsize) (((bitsize+7)&~7) >> 3)

template <int BITSIZE>
class CStaticBitString {
public:
	void	Clear();
	void	Set(int bit);
	void	Reset(int bit);
	int		Test(int bit);
	char*	GetData();

private:
	unsigned char data[BIT2BYTE(BITSIZE)];
};

template <int BITSIZE>
inline void CStaticBitString<BITSIZE>::Clear() {
	memset(data, 0, size+1);
}

template <int BITSIZE>
inline void CStaticBitString<BITSIZE>::Set(int bit) {
	data[bit>>3] |= 1<<(bit&7);
}

template <int BITSIZE>
inline void CStaticBitString<BITSIZE>::Reset(int bit) {
	data[bit>>3] &= ~(1<<(bit&7));
}

template <int BITSIZE>
inline int CStaticBitString<BITSIZE>::Test(int bit) {
	return (data[bit>>3] & 1<<(bit&7));
}

template <int BITSIZE>
inline char* CStaticBitString<BITSIZE>::GetData() {
	return data;
}

// No bounds checking
class CBitString {
public:
			CBitString();
			~CBitString();
	void	Init(int bitsize);
	void	Clear();
	void	Set(int bit);
	void	SetCond(int bit, bool oneOrZero);
	void	Reset(int bit);
	int		Test(int bit);
	void	BitAND(CBitString *bs);
	unsigned char*
			GetData();
	void	Swap(CBitString *bs);
	void	SetData(void* data);
private:
	unsigned char *data;
	int		byteSize;
};

inline CBitString::CBitString():data(0),byteSize(0) {};

inline CBitString::~CBitString() {
	delete [] data;
};

inline void CBitString::Init(int bitsize) {
	//byteSize = (bitsize>>3) + (int)((bool)(bitsize&7));
	byteSize = ((bitsize+7)&~7) >> 3;
	data = new unsigned char [byteSize];
	memset(data, 0, byteSize);
}

inline void CBitString::Clear() {
	memset(data, 0, byteSize);
}

inline void CBitString::Set(int bit) {
	data[bit>>3] |= 1<<(bit&7);
}

inline void CBitString::SetCond(int bit, bool oneOrZero) {
	data[bit>>3] |= ((int)oneOrZero)<<(bit&7);
}

inline void CBitString::Reset(int bit) {
	data[bit>>3] &= ~(1<<(bit&7));
}

inline int CBitString::Test(int bit) {
	return (data[bit>>3] & 1<<(bit&7));
}

inline unsigned char* CBitString::GetData() {
	return data;
}

inline void	CBitString::Swap(CBitString *bs) {
	unsigned char *t = data;
	data = bs->data;
	bs->data = t;

	int b = byteSize;
	byteSize = bs->byteSize;
	bs->byteSize = b;
}

inline void CBitString::BitAND(CBitString *bs) {
	for(int i=0; i<byteSize; i++)
		data[i] &= bs->data[i];
}

inline void CBitString::SetData(void* cdata) {
	memcpy(data, cdata, byteSize);
}

⌨️ 快捷键说明

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