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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 !Zc#E,  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 gdyWuOxa|  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ka(3ONbG  
象当作char数组来处理。 U!BZs Vx  
template<class Container> P~x4h{~Gd  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, =W"T=p*j  
void, void> H3iYE~^#  
{ qzZ;{>_f  
public: &=T>($3r94  
explicit bit_iterator(Container& c) : m_container(&c) c3<H272\  
{ W>b\O">  
m_size = 8*sizeof(Container); am| 81)|a  
m_index = 0; 7<2^8 `  
} o(D_ /]'8  
explicit bit_iterator() : m_container(0) (58r9WhS  
{ cmd7-2  
m_size = 8*sizeof(Container); x%W~@_  
m_index = m_size; ox";%|PP1  
} +I:/8,&-x  
bool operator* () ;uZeYY?   
{ F<*zL:-Z  
char mask = 1; c% ?@3d  
char* pc = (char*)m_container; cb. -AlqQ  
int i   = (m_size-m_index-1)/8; tpgD{BY^wJ  
int off   = (m_size-m_index-1)%8; )! k l:  
mask <<=off; `:0Auw9h  
return pc & mask; VPVg \K{  
} +lf`Dd3  
bit_iterator<Container>& operator++() &*Kk> 4  
{ yVpru8+eD  
m_index++; uFvR(LDb&g  
return *this; yU~w Zjw  
} 7o7FW=^  
bit_iterator<Container>& operator++(int) 8ddBQfCY  
{ Y%zWaH  
m_index++; Tg=P*HY6  
return *this; x69RQ+Vw  
} md/h\o&  
bool operator==(bit_iterator<Container>& bitIt) S]&aDg1y}  
{ ClPE_Cfw~  
return m_index == bitIt.m_index; CRNt5T>qH  
} [l~G7u.d  
bool operator!=(bit_iterator<Container>& bitIt) \r3SvBwhFv  
{ j5~~%  
return !(*this == bitIt); 4#B 56f8  
} scE#&OWF%  
protected: sv6m)pwh  
Container* m_container; =&: |a$C  
private: S.U#lAn(  
int m_size; :{KpnJvd  
int m_index; u})8)  
}; # 3FsK  
sWVapu p?  
用该迭代器可以将任意类型对象以二进制格式输出: JE eXoGKd  
double a = 10; +z~bH!$2  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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