版权声明:一辈子做程序员有何不可? 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 查看本文章