liebitarray.cpp
来自「某个实验事编写粗糙集智能信息处理的程序」· C++ 代码 · 共 265 行
CPP
265 行
#include "stdafx.h"
#include "liebitarray.h"
#include <iostream>
//用来判断位串的任意位是否为1,或给位串的任意位置位所使用的常数
unsigned long CLieBitArray::data_1s[32]=
{ //16进制 32位
0x00000001,0x00000002,0x00000004,0x00000008,
0x00000010,0x00000020,0x00000040,0x00000080,
0x00000100,0x00000200,0x00000400,0x00000800,
0x00001000,0x00002000,0x00004000,0x00008000,
0x00010000,0x00020000,0x00040000,0x00080000,
0x00100000,0x00200000,0x00400000,0x00800000,
0x01000000,0x02000000,0x04000000,0x08000000,
0x10000000,0x20000000,0x40000000,0x80000000
};
//用来判断位串的任意位是否为0,或给位串的任意位清零所使用的常数
unsigned long CLieBitArray::data_0s[32]=
{ //a-11 b-12 c-13 d-14 e-15 f-16
0xfffffffe,0xfffffffd,0xfffffffb,0xfffffff7,
0xffffffef,0xffffffdf,0xffffffbf,0xffffff7f,
0xfffffeff,0xfffffdff,0xfffffbff,0xfffff7ff,
0xffffefff,0xffffdfff,0xffffbfff,0xffff7fff,
0xfffeffff,0xfffdffff,0xfffbffff,0xfff7ffff,
0xffefffff,0xffdfffff,0xffbfffff,0xff7fffff,
0xfeffffff,0xfdffffff,0xfbffffff,0xf7ffffff,
0xefffffff,0xdfffffff,0xbfffffff,0x7fffffff,
};
//给数组的第index的元素赋值newValue
bool CLieBitArray::SetValue(int index,unsigned long newValue)
{
if (index>m_iDataLength-1)
return false;
m_pData[index]=newValue;
return true;
}
int CLieBitArray::Get1s()const
{//获得该位串中1的个数
int res=0;
for(int i=0;i<m_iLength;i++)
if (operator[](i))
res++;
return res;
}
int CLieBitArray::Get0s()const
{//获得该位串中0的个数
int res=0;
for(int i=0;i<m_iLength;i++)
if (! operator[](i))
res++;
return res;
}
CLieBitArray::CLieBitArray(int length):m_iLength(length)
{//由bit位数计算unsigned long的个数,并给数组m_pData(unsigned long类型)分配存储空间
m_iDataLength=m_iLength/ (sizeof(unsigned long) *8);
if ( m_iLength % (sizeof(unsigned long)*8 )!=0 )
m_iDataLength++;
if((m_pData=new unsigned long[m_iDataLength])==0)
{
AfxMessageBox("失败!内存不足!");
return;
}
for(int i=0;i<m_iDataLength;i++)
m_pData[i]=0;
}
CLieBitArray::CLieBitArray(const CLieBitArray& obj) //copy constructor
{//从同类型对象obj拷贝所有成员,包括位数,元素个数即数组本身
m_iLength=obj.m_iLength;
m_iDataLength=obj.m_iDataLength;
// assign
m_pData=NULL;
if((m_pData= new unsigned long[m_iDataLength])==0)
{
AfxMessageBox("失败!内存不足!");
return;
}
for (int i=0;i<m_iDataLength;i++)
{
m_pData[i]=obj.m_pData[i];
}
}
CLieBitArray CLieBitArray::operator = (const CLieBitArray& obj)
{//重载=运算符,功能和拷贝构造函数相同
if(m_pData) delete[] m_pData;
m_iLength=obj.m_iLength;
m_iDataLength=obj.m_iDataLength;
// assign
if((m_pData= new unsigned long[m_iDataLength])==0)
{
AfxMessageBox("失败!内存不足!");
return *this;
}
for (int i=0;i<m_iDataLength;i++)
{
m_pData[i]=obj.m_pData[i];
}
return *this;
}
CLieBitArray::~CLieBitArray()
{
delete[] m_pData;
}
CLieBitArray CLieBitArray:: operator & (const CLieBitArray& other)const
{//返回位串之间的&(与)运算,并没有改变原位串的值
CLieBitArray result(m_iLength);
for (int i=0;i<m_iDataLength;i++)
result.SetValue(i,m_pData[i] & other.m_pData[i] );
return result;
}
CLieBitArray CLieBitArray::operator | (const CLieBitArray&other)const
{
CLieBitArray result(m_iLength);
for (int i=0;i<m_iDataLength;i++)
result.SetValue(i,m_pData[i] | other.m_pData[i] );
return result;
}
CLieBitArray CLieBitArray::operator ^ (const CLieBitArray&other)const
{//^(异或)
CLieBitArray result(m_iLength);//堆栈上创建,全局变量
for (int i=0;i<m_iDataLength;i++)
result.SetValue(i,m_pData[i] ^ other.m_pData[i] );
return result;
}
CLieBitArray CLieBitArray::operator ~ ()const
{//对自身的~(求反)运算
CLieBitArray result(m_iLength);
for (int i=0;i<m_iDataLength;i++)
result.SetValue(i,~m_pData[i]);
return result;
}
bool CLieBitArray::SetBit(int index)
{//把位串的第index位赋为1
//find the exact place
int IndexOfData= index / (sizeof(unsigned long)*8);
int IndexOfLong= index % (sizeof(unsigned long)*8);
m_pData[IndexOfData] |= data_1s[IndexOfLong];
return true;
}
bool CLieBitArray::ClearBit(int index)
{//把位串的第index位清零
//find the exact place
int IndexOfData= index / (sizeof(unsigned long)*8);
int IndexOfLong= index % (sizeof(unsigned long)*8);
m_pData[IndexOfData] &= data_0s[IndexOfLong];
return true;
}
CLieBitArray CLieBitArray::operator << (int step)const//不懂???
{
for (int i=m_iDataLength-1;i>0;i--)
{
m_pData[i] =m_pData[i] << step;//位左移运算
int temp=-1;
temp=temp<< (32-step);
temp &= m_pData[i-1];
temp=temp>> (32-step);
m_pData[i] |=temp;
}
m_pData[0]=m_pData[0]<<step;
return *this;
}
CLieBitArray CLieBitArray::operator >> (int step)const//不懂???
{
for (int i=0;i<m_iDataLength-1;i++)
{
m_pData[i] =m_pData[i] >> step;//位右移运算
int temp=-1;
temp=temp>> (32-step);
temp &= m_pData[i+1];
temp=temp<< (32-step);
m_pData[i] |=temp;
}
m_pData[m_iDataLength-1]=m_pData[m_iDataLength-1]<<step;
return *this;
}
bool CLieBitArray::operator == (const CLieBitArray& obj)const
{
// std::cout<<m_iLength<<" "<<obj.m_iLength;
if(m_iLength!=obj.m_iLength)
return false;
for (int i=0;i<m_iDataLength;i++)
if (m_pData[i] != obj.m_pData[i])
return false;
return true;
}
bool CLieBitArray::operator != (const CLieBitArray& obj)const
{
return ! operator ==(obj);
}
bool CLieBitArray::operator [](int index) const
{//判断位串的第index位是否为1
int IndexOfData= index / (sizeof(unsigned long)*8);
int IndexOfLong= index % (sizeof(unsigned long)*8);
// return (( 1<<IndexOfLong ) & m_pData[IndexOfData]) != 0 ;
return ( data_1s[IndexOfLong] & m_pData[IndexOfData] ) !=0;
}
void CLieBitArray::ClearAll()
{
for(int i=0;i<m_iDataLength;i++)
m_pData[i]=0;
}
void CLieBitArray::SetAll()
{
for(int i=0;i<m_iDataLength;i++)
m_pData[i]=0xffffffff;
}
CLieBitArray CLieBitArray::operator |= (const CLieBitArray& other)
{//位串之间的|运算
for (int i=0;i<m_iDataLength;i++)
SetValue(i,m_pData[i] | other.m_pData[i] );
return *this;
}
bool CLieBitArray::operator <(const CLieBitArray& obj)const
{//比较两个位串的大小,true表示该对象小于比较的对象
for(int i=m_iDataLength-1;i>=0;i--)
{
if (m_pData[i] < obj.m_pData[i])
return true;//因为是从高到低位比较,所以如果高位小于,故整体小于
else if (m_pData[i] > obj.m_pData[i])
return false;
else continue;//相等
}
return false;//全部相等
}
bool CLieBitArray::operator >(const CLieBitArray& obj)const
{//比较两个位串的大小,ture表示该对象大于比较的对象
for(int i=m_iDataLength-1;i>=0;i--)
{
if (m_pData[i] < obj.m_pData[i])
return false;
else if (m_pData[i] > obj.m_pData[i])
return true;
else continue;
}
return false;
}
CLieBitArray CLieBitArray::Flip(int index)
{//把位串的第index位变反
int IndexOfData= index / (sizeof(unsigned long)*8);
int IndexOfLong= index % (sizeof(unsigned long)*8);
m_pData[IndexOfData] ^= data_1s[IndexOfLong];
return *this;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?