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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 [/fwt!  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 tr9_bl&z  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ^&Rxui  
象当作char数组来处理。 c|;|%"Mk  
template<class Container> !Z0rTC3d  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, r{6B+3J  
void, void> 9'/|?I  
{ #QyK?i*  
public: G~iYF(:&  
explicit bit_iterator(Container& c) : m_container(&c) q3pN/f;kr,  
{ r* /XB0  
m_size = 8*sizeof(Container); }T1Xds8w)t  
m_index = 0; z7us*8X{  
} nm:let7GB  
explicit bit_iterator() : m_container(0) V~uA(3\U  
{ e2=,n6N]c  
m_size = 8*sizeof(Container); -R8!"~o  
m_index = m_size; =ZJ?xA8  
} w or'=byh\  
bool operator* () >!v,`O1  
{ g#KToOP  
char mask = 1; MIXrLh3  
char* pc = (char*)m_container; I?B,rT3 h  
int i   = (m_size-m_index-1)/8; pTV@nP  
int off   = (m_size-m_index-1)%8; &T{B~i3w8  
mask <<=off; R82Zr@_  
return pc & mask; *O}'2Ht6\  
} M]/wei"X  
bit_iterator<Container>& operator++() .V)2Tz  
{ G4J6  
m_index++; _ry En  
return *this;  !k??Kj  
} x8rFMR#S=  
bit_iterator<Container>& operator++(int) X#NeB>~  
{ r|H!s,  
m_index++; 3TvhOC>yG  
return *this; aXid;v,  
} &+w!'LSaD  
bool operator==(bit_iterator<Container>& bitIt) 1r:fxZO\Vd  
{ 7J!d3j2TR  
return m_index == bitIt.m_index; g]#zWTw(   
} 8wx#,Xa  
bool operator!=(bit_iterator<Container>& bitIt) H1ui#5n2  
{ d# ?* 62  
return !(*this == bitIt); /wRK[i  
} ;KZ2L~ THG  
protected: kc(b;EA  
Container* m_container; -mYI[AG)  
private: |u@>[*k'=  
int m_size; 1eR{~ ,  
int m_index; yI)fu^  
}; uY%3X/^j  
YrcC"  
用该迭代器可以将任意类型对象以二进制格式输出: =z /mI y<  
double a = 10; yar IR|  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五