CBitsets 二进制类

版权声明:一辈子做程序员有何不可? https://blog.csdn.net/yoyo18520/article/details/42613807

开始写写博客,做做笔记,学习学习。

参照标准库函数中的Bitsets写的基于MFC上的操作二进制类,实现了一些简单的操作,特此记录一下,可能后续会完善其他功能。


头文件声明:

#pragma once
#include <math.h>
/*
*	二进制类
*
*/
enum TYPE_RADIX
{
	BIN				=	0,          // 二进制数
	DEC,                                                // 十进制数
	HEX,                                                // 十六进制数
};

class CBitsets
{
public:
	CBitsets(void);
	CBitsets(UINT value);
	CBitsets(TCHAR* value, TYPE_RADIX nRadix);
	~CBitsets(void);

	CString				to_str(TYPE_RADIX nRadix = BIN);                // 返回相应的进制字符串
	UINT				to_ulong();                                     // 返回长整型数据
	void				reset();                                        // 重置二进制
	bool				test(size_t pos);                               // 测试指定位的值
	size_t				count();                                        // 二进制位中被设置成1的个数
private:
	UINT				m_bitset;                                       // 十进制形式
	CString				m_strBit;                                       // 字符串
	size_t				m_size;                                         // 能容纳多少位
};

实现部分:

#include "StdAfx.h"
#include "Bitsets.h"

CBitsets::CBitsets(void)
{
	this->m_bitset = 0;
	this->m_size = 0;
	this->m_strBit = _T("");
}

CBitsets::CBitsets(UINT value)
{
	this->m_bitset = value;
	this->m_size = (int)(log(value / 1.0) / log(2.0)) + 1;
	this->m_strBit = _T("");
}

CBitsets::CBitsets(TCHAR* value, TYPE_RADIX nRadix)
{
	CString strRadix = _T(""), strValue(value);
	strValue.MakeUpper();
	this->m_bitset = 0;
	double dbBase = 0.0;
	switch (nRadix)
	{
	case BIN:
		{
			strRadix = _T("01");
			dbBase = 2.0;
		}
		break;
	case DEC:
		{
			strRadix = _T("0123456789");
			dbBase = 10.0;
		}
		break;
	case HEX:
		{
			strRadix = _T("0123456789ABCDEF");
			dbBase = 16.0;
		}
		break;
	default:
		break;
	}

	for (int i = strValue.GetLength() - 1, pos = 0; i >= 0 ; i--, pos++)
	{
		int n = strRadix.Find(strValue.GetAt(i));
		this->m_bitset += n * (int)pow(dbBase, pos / 1.0);
	}
	this->m_size = (int)(log(m_bitset / 1.0) / log(2.0)) + 1;
}

CBitsets::~CBitsets(void)
{
//	delete []m_strBit;
}
// 返回相应的进制字符串
CString CBitsets::to_str(TYPE_RADIX nRadix/* = 0*/)
{
	CString strValue = _T("");
	switch (nRadix)
	{
	case BIN:					// 二进制
		{
			for (int i = m_size - 1; i >= 0; i--)
			{
				CString strTemp = _T("");
				strTemp = ((m_bitset >> i) & 0x01) == 1 ? _T("1") : _T("0");
				strValue += strTemp;
			}
		}
		break;
	case DEC:					// 十进制
		{
			strValue.Format(_T("%d"), this->m_bitset);
		}
		break;
	case HEX:					// 十六进制
		{
			CString sz[16] = {_T("0"), _T("1"), _T("2"), _T("3"), _T("4"), _T("5"), _T("6"), _T("7"), \
			_T("8"), _T("9"), _T("A"), _T("B"), _T("C"), _T("D"), _T("E"), _T("F")};
			int n = (int)(log(m_bitset / 1.0) / log(16.0))/* + 1*/;
			for (int i = 4 * n; i >= 0; i -= 4, n--)
			{
				strValue += sz[(m_bitset >> i) & 0x0f];
			}
		}
		break;
	default:
		break;
	}
//	wcscpy(this->m_strBit, strValue.GetBuffer());
	return (this->m_strBit = strValue);
}

// 返回长整型数据
UINT CBitsets::to_ulong()
{
	return this->m_bitset;
}

// 重置二进制
void CBitsets::reset()
{
	this->m_bitset = 0;
}

// 测试指定位的值
bool CBitsets::test(size_t pos)
{
	return (((m_bitset >> (pos - 1)) & 0x01) == 1) ? true : false;
}

// 二进制位中被设置成1的个数
size_t CBitsets::count()
{
	size_t count = 0;
	for (int i = 0; i < this->m_size; i++)
	{
		if ((this->m_bitset >> i) & 0x01)	count++;
	}
	return count;
}

效果预览图:





扫描二维码关注公众号,回复: 3700887 查看本文章





猜你喜欢

转载自blog.csdn.net/yoyo18520/article/details/42613807
今日推荐