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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 "J{zfWr  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 DZ.trtK  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 k& s7 -yY  
象当作char数组来处理。  7~nCK  
template<class Container> A_~5|  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, -$t,}3  
void, void> 1<`7MN  
{ CZRo{2!?U  
public: a3O_#l-Z  
explicit bit_iterator(Container& c) : m_container(&c) f94jMzH9z  
{ HbfB[%  
m_size = 8*sizeof(Container); 'a^tL[rLP1  
m_index = 0; yKEFne8^  
} eI rmD  
explicit bit_iterator() : m_container(0) =L),V~b  
{ |;m`874  
m_size = 8*sizeof(Container); YQdX>k  
m_index = m_size; WAXts]=  
} CN~NyJL H  
bool operator* () PFy;qk  
{ 65#:2,s  
char mask = 1; ?VP!1O=J  
char* pc = (char*)m_container; / &D$kxz  
int i   = (m_size-m_index-1)/8; g^$11  
int off   = (m_size-m_index-1)%8; 33'lZ ubV  
mask <<=off; D#Yx,`Ui  
return pc & mask; Ij}F<ZgZG  
} (e3Gs+;  
bit_iterator<Container>& operator++() TTZxkK  
{ F*JvpI[7n  
m_index++; (2bZ]  
return *this; !aw#',r8m  
} N^( lUba  
bit_iterator<Container>& operator++(int) l()MYuLNV  
{ 2, "q_d'V  
m_index++; ,,gLrV k  
return *this; N46$EsO!h  
} vd7N&c9  
bool operator==(bit_iterator<Container>& bitIt) 0$L0fhw.  
{ !_-sTZ  
return m_index == bitIt.m_index; 795Jwv  
} .A7tq  
bool operator!=(bit_iterator<Container>& bitIt) R 4$Q3vcH  
{ Sja{$zL+W  
return !(*this == bitIt); WCmNibj  
} m_!vIUOz  
protected: -N7L #a  
Container* m_container; 3R%UPT0>  
private: "G9'm  
int m_size; ) Zb`~w  
int m_index; `o8{qU,*]N  
}; =6Sj}/   
Wd` QpW  
用该迭代器可以将任意类型对象以二进制格式输出: C nSX  
double a = 10; Xvj=*wg\Y  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五