社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3146阅读
  • 0回复

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 C1e@{>  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %~PcJhz  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 hNsi  8/  
象当作char数组来处理。 `MCiybl,&P  
template<class Container> `_)H aF>/  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, vQyY %  
void, void> Vx2/^MiXy  
{ JPAjOcmU/  
public: g i6s+2  
explicit bit_iterator(Container& c) : m_container(&c) fs 2MYat  
{ l=p_  
m_size = 8*sizeof(Container); 4NW!{Vw ,  
m_index = 0; 'E9{qPLk(  
} h{iuk3G`h6  
explicit bit_iterator() : m_container(0) wpuK?fP  
{ 6ICW>#fI`  
m_size = 8*sizeof(Container); ! #_2 ![  
m_index = m_size; 'mbLK#q  
} hdCd:6   
bool operator* () JR#4{P@A  
{ j :B/ FL  
char mask = 1; #55:qc>m  
char* pc = (char*)m_container; 4qp|g'uXT  
int i   = (m_size-m_index-1)/8; G(.G>8pf  
int off   = (m_size-m_index-1)%8; n 5R9<A^  
mask <<=off; oG1zPspL  
return pc & mask; WM?-BIlT=  
} ioD8-  
bit_iterator<Container>& operator++() 9Z!n!o7D  
{ F0p=|W  
m_index++; XDJE]2^52?  
return *this; Lm~<BBp.  
} fMg9h9U  
bit_iterator<Container>& operator++(int) )g dLb}  
{ d/ ^IL*O  
m_index++; /]3[|  
return *this; QR#>Ws  
} k\ .9iI'6  
bool operator==(bit_iterator<Container>& bitIt) t_jn-Idcf  
{ Rtz~:v%  
return m_index == bitIt.m_index; fV|uKs(W  
} 6!"wiM"]  
bool operator!=(bit_iterator<Container>& bitIt) ,{HQKHg  
{ k3qQU)  
return !(*this == bitIt); vvv'!\'#  
} v,ZYh w  
protected: d-B+s%>D  
Container* m_container; ?-<lIF Fh  
private: m%`YAD@2z  
int m_size; jeWv~JA%L|  
int m_index; &|{1Ws  
}; cl4z%qv*  
{73V?#P4  
用该迭代器可以将任意类型对象以二进制格式输出: ^#<L!yo^  
double a = 10; {\D &*  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五