亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bitarray.cpp

?? The Bit Array structure provides a compacted arrays of Booleans, with one bit for each Boolean value
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
////////////////////////////////////////////////////////////////////////////
//
//	Inventor Name: Hatem Mostafa
//	Creation date: 15/1/2003
//
////////////////////////////////////////////////////////////////////////////
// BitArray.cpp : implementation of the CBitArray class
//

#include "stdafx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define 	SEG_COUNT		10240

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBitArray::CBitArray(bool bCompressed /*= false*/)
{
	InitValues();
	m_bCompressed = bCompressed;
}

CBitArray::CBitArray(CBitArray &src)
{
	InitValues();

	*this = src;
}

CBitArray::CBitArray(BYTE* pBuffer, int nLength, bool bCompressed /*= false*/)
{
	InitValues();

	m_bCompressed = bCompressed;
	Init(pBuffer, nLength);
}

void CBitArray::InitValues()
{
	m_pBuffer = NULL;
	m_nLength = m_nAllocLength = 0;
	m_nCount = -1;
	m_nIndexes = NULL;
	m_bModified = false;
	m_nBitSeg = 1;
	m_bCompressed = false;
}

CBitArray::~CBitArray()
{
	if(m_pBuffer)
		FreePtr(m_pBuffer);
	if(m_nIndexes)
		free(m_nIndexes);
}

void CBitArray::FreeBuffer()
{
	if(m_pBuffer)
		FreePtr(m_pBuffer);
	if(m_nIndexes)
		free(m_nIndexes);
	m_nIndexes = NULL;
	m_pBuffer = NULL;
	m_nLength = m_nAllocLength = 0;
	m_nCount = -1;
}

int CBitArray::GetCount()
{
	if(m_nCount == -1)
	{	// (^_^) 19/2/2004 hmh
//		static BYTE bitCount[16] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
		static BYTE bitCount[256] = { 
			0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
			1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
			1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
			2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
			1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
			2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
			2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
			3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 };
		BYTE by;
		m_nCount = 0;
		for(int nByte = 0; nByte < m_nLength; nByte++)
			if(by = m_pBuffer[nByte])
//				m_nCount += by == 0xff ? 8 : bitCount[by&0x0f] + bitCount[(by&0xf0) >> 4];
				m_nCount += bitCount[by];
	}
	return m_nCount;
}

int CBitArray::GetRangeCount(int nStartBit, int nEndBit)
{	// (^_^) 6/3/2004 hmh
	static BYTE bitCount[16] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };

	int nCount = 0;
	BOOL bFirstByte = (nStartBit&7) != 0;
	if(bFirstByte)
		for(int nBit = nStartBit; nBit < (nStartBit/8+1)*8; nBit++)
			if(GetAt(nBit))
				nCount++;
	int nEndByte = nEndBit/8;
	BYTE by;
	for(int nByte = nStartBit/8+bFirstByte; nByte < nEndByte; nByte++)
		if(by = m_pBuffer[nByte])
			nCount += by == 0xff ? 8 : bitCount[by&0x0f] + bitCount[(by&0xf0) >> 4];
	for(int nBit = nEndByte*8; nBit <= nEndBit; nBit++)
		if(GetAt(nBit))
			nCount++;

	return nCount;
}

void CBitArray::Index()
{	// (^_^) 21/2/2004 hmh
	if(GetLength() == 0)
		return;
	// calculate number of ones that will be include in each index
	m_nBitSeg = GetCount()/SEG_COUNT + 1;
	if(m_nIndexes)
		free(m_nIndexes);
	// allocate buffe of the indices array
	m_nIndexes = (int *)malloc(sizeof(int)*(m_nCount/m_nBitSeg+1));
	m_nIndexesCount = m_nCount = 0;
	BYTE by;
	// loop in the bitmap buffer to index '1's locations
	for(int nBit, nByte = 0; nByte < m_nLength; nByte++)
		// copy buffer byte into by and check if it is not 0
		if(by = m_pBuffer[nByte])
		{	// get bit number by multiply by 8 (or left shift by 3)
			nBit = nByte<<3;
			while(by)
			{	// if the first bit in the byte is '1'
				if(by&1)
					// check if the bit in the head of the index
					if(m_nCount++ % m_nBitSeg == 0)
						// add this bit to the indices
						m_nIndexes[m_nIndexesCount++] = nBit;
				// shift right to move second bit to the byte head
				by >>= 1, nBit++;
			}
		}
}

void CBitArray::SetLength(int nLength)
{
	if(nLength == 0)
		FreeBuffer();
	else	if(nLength > m_nAllocLength)
	{
		m_nAllocLength = nLength+(m_bCompressed?0:100);
		if(m_pBuffer == NULL)
			m_pBuffer = (BYTE*)AllocPtr(m_nAllocLength);
		else
			m_pBuffer = (BYTE*)ReAllocPtr(m_pBuffer, m_nAllocLength);
	}
	m_nLength = nLength;
	m_bModified = true;
}

BYTE *CBitArray::Detach()
{
	BYTE * p = m_pBuffer;
	m_pBuffer = NULL;
	FreeBuffer();
	
	return p;
}

void CBitArray::Attach(BYTE* pBuffer, int nLength)
{
	FreeBuffer();
	if(nLength > 0)
	{
		m_pBuffer = pBuffer;
		m_nLength = m_nAllocLength = nLength;
	}
	m_bModified = true;
}

void CBitArray::SetRange(int nStartBit, int nEndBit)
{
	if(nEndBit >= m_nLength*8)
		SetLength(nEndBit/8+1);
	for(int nBit = nStartBit; nBit <= nEndBit; nBit++)
		SetBit(m_pBuffer, nBit);
	SetModified();
}

void CBitArray::ResetRange(int nStartBit, int nEndBit)
{
	if(nEndBit >= m_nLength*8)
		nEndBit = m_nLength*8-1;
	for(int nBit = nStartBit; nBit <= nEndBit; nBit++)
		ResetBit(m_pBuffer, nBit);
	SetModified();
}

void CBitArray::ResetAt(CBitArray *pBitArray)
{
	int nLength = min(m_nLength, pBitArray->GetLength())*8;
	for(int nBit = 0; nBit < nLength; nBit++)
		if(pBitArray->GetAt(nBit))
			ResetBit(m_pBuffer, nBit);
	SetModified();
}

void CBitArray::XOrRange(int nStartBit, int nEndBit)
{
	if(nEndBit >= m_nLength*8)
		SetLength(nEndBit/8+1);
	for(int nBit = nStartBit; nBit <= nEndBit; nBit++)
		XOrBit(m_pBuffer, nBit);
	SetModified();
}

void CBitArray::CopyRange(const CBitArray& src, int nStartBit, int nEndBit)
{
	if(nStartBit >= src.m_nLength*8)
		return;
	nEndBit = min(nEndBit, src.m_nLength*8-1);

	if(nEndBit >= m_nLength*8)
		SetLength(nEndBit/8+1);

	BOOL bFirstByte = (nStartBit&7) != 0;
	int nStartByte = nStartBit/8+bFirstByte, nEndByte = max(nStartByte, nEndBit/8);
	if(bFirstByte)
		for(int nBit = nStartBit; nBit < nStartByte*8; nBit++)
			GetBit(src.m_pBuffer, nBit) ? SetBit(m_pBuffer, nBit) : ResetBit(m_pBuffer, nBit);
	if(nEndByte > nStartByte)
		memcpy(m_pBuffer+nStartByte, src.m_pBuffer+nStartByte, nEndByte-nStartByte);
	for(int nBit = nEndByte*8; nBit <= nEndBit; nBit++)
		GetBit(src.m_pBuffer, nBit) ? SetBit(m_pBuffer, nBit) : ResetBit(m_pBuffer, nBit);
	SetModified();
}

void CBitArray::Compress()
{
	if(m_bCompressed || m_nLength == 0)
		return;
	m_bCompressed = true;

	int nLength = m_nLength;
	BYTE *p = new BYTE[m_nLength];
	memcpy(p, m_pBuffer, m_nLength);
	FreeBuffer();
	Compress(p, nLength, m_pBuffer, m_nLength);
	delete p;
}

void CBitArray::Decompress()
{
	if(!m_bCompressed || m_nLength == 0)
		return;
	m_bCompressed = false;

	Decompress(m_pBuffer, m_nLength);
}

#define COMPRESS_TYPE	WORD//BYTE
#define COMPRESS_SIZE	2//1
#define COMPRESS_COUNT	65535//255

void CBitArray::Compress(BYTE *src, int nSrcLen, BYTE *&des, int &nDesLen)
{
	nDesLen = 1;	// keep first byte for compression info
	while(nSrcLen && src[nSrcLen-1] == 0)
		nSrcLen--;
	if(nSrcLen == 0)
	{
		des = NULL;
		nDesLen = 0;
		return;
	}
	int nLength = nSrcLen;
	if(nLength)
		des = (BYTE*)AllocPtr(nLength);
	des[0] = 1;	// COMPRESS_TYPE	WORD
	int nByte = 0, nRunLength;
	BYTE byType;
	while(nByte < nSrcLen)
	{
		if(nDesLen+5 > nLength)
		{
			nLength += 1024;
			des = (BYTE*)ReAllocPtr(des, nLength);
		}
		byType = des[nDesLen++] = src[nByte++];
		if(byType == 0 || byType == 0xff)
		{
			nRunLength = 1;
			while(nRunLength < COMPRESS_COUNT && nByte < nSrcLen && src[nByte] == byType)
				nRunLength++, nByte++;
			*(COMPRESS_TYPE*)(des+nDesLen) = nRunLength;
			nDesLen += COMPRESS_SIZE;
		}
	}
}

void CBitArray::Decompress(BYTE *&src, int &nSrcLen, int nMaxLen /*= -1*/)
{
	if(nSrcLen == 0)
		return;
	int nDesLen = 0;
	int nLength = nSrcLen, nRunLength;
	BYTE* des = (BYTE*)AllocPtr(nLength);
	int nByte = 1;	// first byte kept for comprerssion info
	BYTE byType;
	while(nByte < nSrcLen && (nMaxLen == -1 || nDesLen < nMaxLen))
		if(src[nByte] == 0 || src[nByte] == 0xff)
		{
			byType = src[nByte++];
			nRunLength = *(COMPRESS_TYPE*)(src+nByte);
			nByte += COMPRESS_SIZE;
			if(nDesLen+nRunLength+10 >= nLength)
			{
				nLength = nDesLen+nRunLength+1024;
				des = (BYTE*)ReAllocPtr(des, nLength);
			}
			if(byType)	
				memset(des+nDesLen, byType, nRunLength);
			nDesLen += nRunLength;
		}
		else
		{
			if(nDesLen+10 >= nLength)
			{
				nLength = nDesLen+1024;
				des = (BYTE*)ReAllocPtr(des, nLength);
			}
			des[nDesLen++] = src[nByte++];
		}
	FreePtr(src);
	nSrcLen = nDesLen; 
	src = (BYTE *)ReAllocPtr(des, nSrcLen);
}

bool CBitArray::SetAt(BYTE *&src, int &nSrcLen, int nBit)
{
	int nDesLen = 0;
	int nDesByte = nBit/8;
	if(nSrcLen > 0)
	{
		int nByte = 1;	// first byte kept for comprerssion info
		int nRunLength = 0, nAddedSize;
		BYTE byType = 0;
		while(nByte < nSrcLen)
			if(src[nByte] == 0 || src[nByte] == 0xff)
			{
				byType = src[nByte++];
				nRunLength = *(COMPRESS_TYPE*)(src+nByte);
				if(nDesLen+nRunLength > nDesByte)
				{
					if(byType == 0xff)
						return false;
					// current buffer (0|count) and nByte points to count
					if(nRunLength > 1)
					{	//  (0|count-1|byte) OR (0|count1|byte|0|count2) OR (byte|0|count-1)
						nAddedSize = 1;
						if(nDesByte == nDesLen+nRunLength-1)
						{	// (0|count-1|byte) last byte
							// change the run length
							*(COMPRESS_TYPE*)(src+nByte) = nDesByte-nDesLen;
							// increment buffer index after the old run length
							nByte += COMPRESS_SIZE;
						}
						else	if(nDesByte > nDesLen)
						{	// (0|count1|byte|0|count2) middle byte
							nAddedSize += 1+COMPRESS_SIZE;
							// change the run length
							*(COMPRESS_TYPE*)(src+nByte) = nDesByte-nDesLen;
							// increment buffer index after the old run length
							nByte += COMPRESS_SIZE;
						}
						else	// (byte|0|count-1) frist byte
						{
							*(COMPRESS_TYPE*)(src+nByte) -= 1;
							nByte--;
						}
						// increment buffer size to have new byte(one) + Zero byte + reminder run length
						src = (BYTE*)ReAllocPtr(src, nSrcLen+nAddedSize);
						// move the buffer after the old run length bytes
						memmove(src+nByte+nAddedSize, src+nByte, nSrcLen-nByte);
						memset(src+nByte, 0, nAddedSize);
						// increment buffer size new byte(one) + Zero byte + reminder run length
						nSrcLen += nAddedSize;
						if(nAddedSize > 1)	// save the reminder run length
							*(COMPRESS_TYPE*)(src+nByte+2) = nRunLength-1-(nDesByte-nDesLen);
					}
					else
					{	// remove the zero count 
						memmove(src+nByte, src+nByte+COMPRESS_SIZE, nSrcLen-nByte-COMPRESS_SIZE);
						// decrement buffer size by COMPRESS_SIZE
						nSrcLen -= COMPRESS_SIZE;
						// reset buffer tail
						memset(src+nSrcLen, 0, COMPRESS_SIZE);
						// back to point to the zero byte
						nByte--;
					}
					// set the target bit
					SetBit(src+nByte, nBit&7);
					return true;
				}
				nDesLen += nRunLength;
				nByte += COMPRESS_SIZE;
			}
			else
			{
				if(nDesLen++ == nDesByte)
				{
					if(GetBit(src+nByte, nBit&7))
						return false;
					SetBit(src+nByte, nBit&7);
					if(src[nByte] == 0xff)
						if(nRunLength != COMPRESS_COUNT && byType == 0xff)
						{	// increment previous runlength only
							memmove(src+nByte, src+nByte+1, nSrcLen-nByte-1);
							src[--nSrcLen] = 0;
							*(COMPRESS_TYPE*)(src+nByte-COMPRESS_SIZE) = nRunLength+1;
						}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线精品一区二区不卡了| 国产曰批免费观看久久久| 日韩经典中文字幕一区| 国产精品996| 69久久夜色精品国产69蝌蚪网| 国产女主播视频一区二区| 亚洲综合色视频| 国产成人综合视频| 欧美一区二区精品久久911| 成人免费一区二区三区视频 | 国产精品麻豆一区二区| 日本视频免费一区| 91精品福利在线| 亚洲国产精品精华液ab| 久久99精品久久久久久动态图 | 正在播放亚洲一区| 亚洲免费伊人电影| 成人av资源在线| 国产欧美精品区一区二区三区| 久草热8精品视频在线观看| 欧美日韩成人激情| 亚洲电影中文字幕在线观看| 在线一区二区三区四区| 成人免费在线观看入口| jiyouzz国产精品久久| 国产日韩欧美高清在线| 国产麻豆视频一区二区| 精品88久久久久88久久久| 捆绑紧缚一区二区三区视频| 欧美一区二区三区免费在线看| 亚洲成人先锋电影| 精品视频999| 亚洲成av人片在线| 欧美精品自拍偷拍动漫精品| 婷婷亚洲久悠悠色悠在线播放| 欧美色图免费看| 婷婷六月综合亚洲| 欧美一区二区三区视频| 久久精品理论片| 精品成人佐山爱一区二区| 国产一区在线观看视频| 国产日韩欧美在线一区| k8久久久一区二区三区| 一区二区三区四区不卡在线| 欧美在线免费播放| 日韩av中文字幕一区二区三区 | 欧美色视频在线观看| 午夜日韩在线观看| 日韩三级免费观看| 国产乱理伦片在线观看夜一区| 国产精品视频看| 91丨九色丨蝌蚪丨老版| 午夜av电影一区| 久久免费偷拍视频| 99久免费精品视频在线观看| 亚洲一区二区中文在线| 欧美一区二区三区四区久久| 久久精品国产精品亚洲红杏| 国产精品丝袜久久久久久app| 91在线观看成人| 日韩精品电影在线| 国产欧美一区二区三区在线看蜜臀 | 中文字幕日韩精品一区| 欧美在线高清视频| 国产最新精品精品你懂的| 中文字幕一区日韩精品欧美| 欧美精品少妇一区二区三区| 精品一区二区三区视频在线观看| 国产精品乱码一区二区三区软件 | 欧美三级韩国三级日本一级| 九九精品一区二区| 亚洲乱码国产乱码精品精小说| 51精品秘密在线观看| 国产成人在线视频网站| 亚洲成av人在线观看| 久久精品在线免费观看| 欧美日韩中字一区| 国产成人日日夜夜| 天堂久久一区二区三区| 中文字幕制服丝袜一区二区三区| 91精品欧美一区二区三区综合在| 成人午夜电影网站| 日本视频在线一区| 一区二区三区在线视频免费| 精品国产精品网麻豆系列| 欧洲一区二区av| www.亚洲色图| 经典三级一区二区| 婷婷一区二区三区| 尤物av一区二区| 国产精品久久久久久久久动漫| 欧美成人一区二区三区在线观看| 色婷婷精品大在线视频| 国产很黄免费观看久久| 乱一区二区av| 日产欧产美韩系列久久99| 亚洲精品水蜜桃| 国产精品欧美综合在线| 久久只精品国产| 精品理论电影在线观看| 777亚洲妇女| 欧美日本在线看| 在线观看三级视频欧美| av亚洲产国偷v产偷v自拍| 国产99精品国产| 丁香天五香天堂综合| 国产精品18久久久久久vr| 久久99精品久久久久婷婷| 热久久国产精品| 日韩成人免费电影| 香蕉久久一区二区不卡无毒影院| 亚洲一级二级三级| 一区二区三区影院| 亚洲一区成人在线| 午夜亚洲国产au精品一区二区| 亚洲综合免费观看高清完整版在线| 中文字幕亚洲区| 亚洲精品水蜜桃| 亚洲成人tv网| 欧美aaaaaa午夜精品| 美日韩一级片在线观看| 激情深爱一区二区| 国产精品1024| 9i看片成人免费高清| 91免费看片在线观看| 欧洲一区在线电影| 91精品国模一区二区三区| 欧美成人一区二区| 国产清纯白嫩初高生在线观看91| 国产女主播一区| 自拍av一区二区三区| 亚洲成av人片在线| 久久99精品久久久久久动态图| 国产一区二区三区在线观看免费 | 亚洲精品成人精品456| 亚洲成人黄色小说| 久久国产精品72免费观看| 国产精品一区二区果冻传媒| 99国产精品一区| 欧美日韩精品欧美日韩精品| 欧美一区二区三区不卡| 国产欧美一区二区三区沐欲| 亚洲色图20p| 日本欧美一区二区三区乱码| 国产乱码精品1区2区3区| 一本一本大道香蕉久在线精品 | 日韩av一区二区在线影视| 国产麻豆日韩欧美久久| 91在线视频免费观看| 欧美精品一二三四| 国产欧美一区在线| 手机精品视频在线观看| 国产一区二区三区国产| 91精彩视频在线| 久久人人超碰精品| 亚洲一区二区av电影| 国产盗摄精品一区二区三区在线| 日本韩国视频一区二区| 久久亚洲精品小早川怜子| 亚洲综合色视频| 从欧美一区二区三区| 欧美老人xxxx18| 亚洲欧洲另类国产综合| 美女尤物国产一区| 欧洲一区二区三区免费视频| 久久久国产午夜精品| 午夜视频一区二区| 色综合亚洲欧洲| 国产亚洲人成网站| 蜜桃91丨九色丨蝌蚪91桃色| 色www精品视频在线观看| 国产午夜三级一区二区三| 视频一区中文字幕国产| 91蜜桃在线免费视频| 久久伊99综合婷婷久久伊| 日韩中文字幕麻豆| 在线精品亚洲一区二区不卡| 欧美国产亚洲另类动漫| 国产综合久久久久久鬼色| 欧美日韩精品欧美日韩精品| 亚洲免费av观看| www.欧美.com| 欧美国产一区二区在线观看| 久久99精品久久久久久国产越南| 欧美精品久久一区| 一区二区日韩电影| 色视频一区二区| 亚洲同性同志一二三专区| 大白屁股一区二区视频| 久久综合精品国产一区二区三区| 蜜桃一区二区三区在线观看| 91麻豆精品国产91久久久更新时间| 亚洲美女区一区| 91黄色免费版| 亚洲综合男人的天堂| 欧洲生活片亚洲生活在线观看| 亚洲精选一二三| 在线欧美日韩精品| 亚洲成人手机在线| 欧美精品一二三区|