亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲精品成人a在线观看| 99re6这里只有精品视频在线观看| 国产成人精品影院| 欧美午夜不卡视频| 久久久久久日产精品| 亚洲一区二区五区| 99久久精品一区| 亚洲精品一区二区三区99| 亚洲一区在线电影| 91美女精品福利| 国产丝袜欧美中文另类| 久久成人免费网| 欧美最猛性xxxxx直播| 国产精品第四页| 国产福利一区二区三区视频 | 亚洲国产裸拍裸体视频在线观看乱了| 久久99精品久久久久| 欧美精品亚洲二区| 有码一区二区三区| 91小视频在线观看| 国产精品美女久久久久久久久久久| 久久精品国产亚洲aⅴ| 51久久夜色精品国产麻豆| 亚洲国产综合视频在线观看| 91麻豆国产福利精品| 综合在线观看色| www.一区二区| 18欧美乱大交hd1984| 不卡的av在线| 1024成人网| 色婷婷综合久久久中文一区二区 | 丁香婷婷综合激情五月色| 精品国产一区二区三区av性色| 天使萌一区二区三区免费观看| 在线亚洲一区观看| 亚洲一区视频在线| 欧美日韩国产成人在线免费| 亚洲国产日韩a在线播放性色| 欧美三日本三级三级在线播放| 亚洲一区在线观看免费| 欧美精品久久久久久久多人混战| 亚洲成精国产精品女| 欧美一级高清大全免费观看| 日本sm残虐另类| 久久久亚洲高清| 成人h精品动漫一区二区三区| 亚洲欧洲精品一区二区精品久久久| a在线欧美一区| 亚洲国产中文字幕在线视频综合| 欧美放荡的少妇| 黄色小说综合网站| 国产精品乱子久久久久| 91九色02白丝porn| 免费一级片91| 国产色产综合色产在线视频| av午夜精品一区二区三区| 亚洲中国最大av网站| 9191精品国产综合久久久久久| 精品中文字幕一区二区小辣椒| 久久精品一级爱片| 欧美亚洲自拍偷拍| 国内精品免费**视频| 日韩理论片网站| 日韩一级免费一区| 99国内精品久久| 婷婷久久综合九色国产成人| 国产日韩视频一区二区三区| 在线精品视频小说1| 激情久久五月天| 一区二区三区国产精华| 日韩一级大片在线| 91农村精品一区二区在线| 日韩国产精品久久| 国产日韩av一区二区| 欧美三级中文字幕在线观看| 国产一区二区三区免费| 亚洲韩国精品一区| 国产精品丝袜黑色高跟| 欧美一区二区三区免费观看视频| 成人涩涩免费视频| 免费成人av在线| 亚洲精品日日夜夜| 国产日韩欧美一区二区三区综合| 在线观看不卡视频| 成人av免费在线播放| 久久国产欧美日韩精品| 亚洲一区二区三区不卡国产欧美| 亚洲国产高清在线观看视频| 欧美一区二区人人喊爽| 91精彩视频在线观看| 国产原创一区二区| 天堂影院一区二区| 夜夜嗨av一区二区三区中文字幕| 久久综合av免费| 日韩亚洲国产中文字幕欧美| 色8久久人人97超碰香蕉987| 成人免费视频网站在线观看| 精品一区二区免费在线观看| 日韩成人一级片| 一区二区三区中文字幕精品精品 | 精品日韩一区二区三区| 欧美三级中文字幕在线观看| 色一情一伦一子一伦一区| 国产成人一区在线| 久久国产剧场电影| 天天综合日日夜夜精品| 亚洲超丰满肉感bbw| 一区二区三区欧美日| 亚洲人亚洲人成电影网站色| 国产精品嫩草99a| 国产欧美一区二区在线观看| 国产亚洲综合性久久久影院| 日韩欧美国产电影| 精品久久免费看| 久久久久久电影| 久久精品一区二区| 欧美国产精品中文字幕| 国产精品热久久久久夜色精品三区| 国产欧美一区二区三区网站| 亚洲国产精品v| 亚洲欧美在线视频观看| 亚洲欧美一区二区三区极速播放 | 国产清纯白嫩初高生在线观看91| www一区二区| 国产农村妇女毛片精品久久麻豆| 久久九九99视频| 国产精品私房写真福利视频| 国产日本一区二区| 亚洲精品videosex极品| 亚洲成人在线观看视频| 日韩精品乱码免费| 极品少妇一区二区| 成人免费毛片片v| 日本韩国视频一区二区| 欧美日韩久久一区二区| 日韩一区国产二区欧美三区| 久久久久久久一区| 亚洲视频一区在线观看| 午夜欧美大尺度福利影院在线看 | 不卡一区二区在线| 欧美影视一区在线| 精品久久久久久亚洲综合网| 国产精品人妖ts系列视频| 亚洲自拍偷拍欧美| 国产尤物一区二区在线| 91蝌蚪porny九色| 欧美一二区视频| 国产精品高潮久久久久无| 亚洲一级片在线观看| 精品亚洲成a人| 色狠狠桃花综合| 日韩欧美国产1| 中文字幕中文字幕中文字幕亚洲无线| 一区二区三区精品视频在线| 蜜桃av噜噜一区| 一本一道久久a久久精品综合蜜臀| 91精品国产乱码久久蜜臀| 国产日本欧美一区二区| 日韩电影一二三区| 9久草视频在线视频精品| 欧美一区二区三区系列电影| 国产精品久久久久婷婷| 麻豆91精品91久久久的内涵| 99久久精品国产一区二区三区| 欧美一区二区福利在线| 国产精品久久毛片av大全日韩| 日本网站在线观看一区二区三区 | 精品午夜久久福利影院| 91免费视频网址| 久久色在线观看| 日韩激情av在线| 91蜜桃婷婷狠狠久久综合9色| 精品av综合导航| 日韩精品欧美成人高清一区二区| 99视频一区二区| 欧美激情一区三区| 激情综合色播激情啊| 91精品国产乱码久久蜜臀| 一区二区久久久| av网站一区二区三区| 国产女人18毛片水真多成人如厕 | 久久色.com| 蜜桃一区二区三区四区| 在线看国产一区二区| 国产精品国产三级国产aⅴ入口| 国产精品一区在线观看你懂的| 欧美一区日韩一区| 日本在线观看不卡视频| 欧美日韩一区二区三区不卡 | 日韩精品91亚洲二区在线观看| 97aⅴ精品视频一二三区| 中文字幕电影一区| 成人v精品蜜桃久久一区| 国产日韩欧美在线一区| 国产精品一区二区91| 久久久不卡网国产精品一区| 久久国产夜色精品鲁鲁99| 日韩小视频在线观看专区| 老司机精品视频在线| 日韩一级欧美一级|