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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 q*Oj5;  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ;m7~!m)  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对  ,)uW`7  
象当作char数组来处理。 g:O/~L0Xb  
template<class Container> r$v \\^?2  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Wks zN h  
void, void> ]x).C[^  
{ ce;$)Ff\  
public: ^OV!Q\j.q  
explicit bit_iterator(Container& c) : m_container(&c) lN&+<>a  
{ >z~_s6#CP  
m_size = 8*sizeof(Container); `ZZ3!$czR  
m_index = 0; ,SPgop'  
} }3, 4B -8!  
explicit bit_iterator() : m_container(0) S\]9mHJI  
{ .820~b0  
m_size = 8*sizeof(Container); tU$n3Bg  
m_index = m_size; *<:6A&'D9  
} /0cm7[a?  
bool operator* () <)pPq+  
{ pP#D*hiP-g  
char mask = 1; /Xj{]i3{  
char* pc = (char*)m_container; k( Ik+=u  
int i   = (m_size-m_index-1)/8; h oO847  
int off   = (m_size-m_index-1)%8; Ml9m#c  
mask <<=off; kL8 E#  
return pc & mask; q{Gh5zg5O  
} '%ByFZ zi  
bit_iterator<Container>& operator++() +1I 7K|M  
{ "Bv V89  
m_index++; :IU<AG6  
return *this; Z t4q= Lr  
} Buso `G  
bit_iterator<Container>& operator++(int) =E$bZe8  
{ A9g/At_  
m_index++; 33KCO  
return *this; TV0sxod6  
} JhjH_)  
bool operator==(bit_iterator<Container>& bitIt) b)x0;8<  
{ iITMBS`}  
return m_index == bitIt.m_index; :Jf</uP_  
} m,"-/)  
bool operator!=(bit_iterator<Container>& bitIt)  }D+ b`,  
{ s?s ,wdp  
return !(*this == bitIt); $9j>oUG  
} BW6Ox=sr<  
protected: ?(U;T!n  
Container* m_container; JU;`c>8=)  
private: n!AW9]  
int m_size; p^}`^>OL  
int m_index; $a8,C\m e?  
}; Tt9cX}&&  
k q]E@tE*3  
用该迭代器可以将任意类型对象以二进制格式输出: {]U \HE1w  
double a = 10; GqNOWK2O  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五