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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 R?M>uaxn  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ""*g\  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 J~C=o(r  
象当作char数组来处理。 i8S=uJ]n  
template<class Container> {W HK|l   
class bit_iterator : public std::iterator<bidirectional_iterator_tag, }G<~Cx5[  
void, void> D@kf^1G  
{ {C0Y8:"`  
public: u:^sEk"Lk'  
explicit bit_iterator(Container& c) : m_container(&c) *K BaKS  
{ OY2u,LF9H  
m_size = 8*sizeof(Container); *%*B o9a/  
m_index = 0; | ^G38  
} k5Su&e4]]  
explicit bit_iterator() : m_container(0) ;]@Pm<f  
{ rA E5.Q!u  
m_size = 8*sizeof(Container); vM50H  
m_index = m_size; o#=C[d5BV  
} ("{"8   
bool operator* () zrf tF2U  
{ RhC|x,E  
char mask = 1; | AiMx2  
char* pc = (char*)m_container; 3W{ !\  
int i   = (m_size-m_index-1)/8; F)v  
int off   = (m_size-m_index-1)%8; UmY{2 nzY  
mask <<=off; ;#9ioG x  
return pc & mask; 1}Y3|QxF  
} p$uPj*  
bit_iterator<Container>& operator++() }kP<zvAaw  
{ 3_`)QYU'  
m_index++; XUnw*3tPJ  
return *this; J 5';Hb)  
} U`5/tNx  
bit_iterator<Container>& operator++(int) {e q378d  
{ q^?a|l  
m_index++; #sxv?r  
return *this; dMCoN8W  
} jw`05rw:  
bool operator==(bit_iterator<Container>& bitIt) a=`] L`|N  
{ w)B ?j  
return m_index == bitIt.m_index; sN2m?`?"G  
} -m@PqJF^  
bool operator!=(bit_iterator<Container>& bitIt) WIuYSt)h  
{ r-yUWIr S  
return !(*this == bitIt); *,IK4F6>:  
} v5@M 34  
protected: >239SyC-,  
Container* m_container; -*i_8`  
private: A=IpP}7J  
int m_size; x/wgD'?  
int m_index; xVgm 9s$"c  
}; iJZNSRQJ}r  
GdY@$&z{i  
用该迭代器可以将任意类型对象以二进制格式输出: ch25A<O<R.  
double a = 10; *8po0s  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八