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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 LP m# 3U  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ]cGz~TN~  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 #K,qF*  
象当作char数组来处理。 pb2{J#  
template<class Container> z"P,=M6De  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Gad2EEZ%0  
void, void> [&O:qaD^  
{ b1 ['uJF  
public: Ow .)h(y/  
explicit bit_iterator(Container& c) : m_container(&c) Ppo^qb  
{ ,ov v  
m_size = 8*sizeof(Container); (J;zkb  
m_index = 0; g]PLW3  
} fE7a]R EK  
explicit bit_iterator() : m_container(0) Rcx'a:k  
{ /K<GN7vN  
m_size = 8*sizeof(Container); gkq RO19  
m_index = m_size; Xw}Y!;<IEu  
} OS h mrz28  
bool operator* () C4SD  
{ as\K(c9  
char mask = 1; HV.|Eh_7  
char* pc = (char*)m_container; 52C-D+zCJ  
int i   = (m_size-m_index-1)/8;  ~bWWu`h  
int off   = (m_size-m_index-1)%8; Z$m2rZ#  
mask <<=off; x8rFMR#S=  
return pc & mask; Tdmo'"m8z_  
} }AH|~3|D  
bit_iterator<Container>& operator++() r|H!s,  
{ 3TvhOC>yG  
m_index++; Fi3(glgd-  
return *this; ht74h  
} d&R\7)0  
bit_iterator<Container>& operator++(int) 7J!d3j2TR  
{ g]#zWTw(   
m_index++; 8wx#,Xa  
return *this; =iN_Ug+  
} vJj j+:  
bool operator==(bit_iterator<Container>& bitIt) [\%t<aa  
{ #O974f8  
return m_index == bitIt.m_index; ZWe$(?  
} -_f0AfU/a  
bool operator!=(bit_iterator<Container>& bitIt) #uw*8&%0  
{ fdEj#Ux<H  
return !(*this == bitIt); g:e8i~  
} K|J#/  
protected: @j8L{FGnN  
Container* m_container; &7kSLat+9{  
private: 96V, [-arf  
int m_size; 3SB7)8Id1  
int m_index; /z-C :k\  
}; HE<%d  
r-"`Abev  
用该迭代器可以将任意类型对象以二进制格式输出: jw%FZ  
double a = 10; #FDu 4xi  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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