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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 FJ/kumq  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 B4|3@X0(  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 CpA=DnZ  
象当作char数组来处理。 XMpPG~XdN  
template<class Container> @D%VV=N~[  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 6x_8m^+m  
void, void> F<o J  
{ 4!D!.t~r  
public: a &j H9  
explicit bit_iterator(Container& c) : m_container(&c) g8^$,  
{ qz?9:"~$C  
m_size = 8*sizeof(Container); k9a-\UIMet  
m_index = 0; VEJ Tw  
} *T 6<'a  
explicit bit_iterator() : m_container(0) vAX %i(4  
{ @A g=2\9  
m_size = 8*sizeof(Container); /|Zk$q.\  
m_index = m_size; H`kfI"u8  
} M>-x\[n+  
bool operator* () yhZ2-*pTg  
{ hD sFsG  
char mask = 1; "zfy_h  
char* pc = (char*)m_container; l]GLkE  
int i   = (m_size-m_index-1)/8; |ML|P\1&V  
int off   = (m_size-m_index-1)%8; ktnsq&qNL  
mask <<=off; 1_ %3cN.  
return pc & mask; Rzw}W7zg[  
} ~|riFp=J  
bit_iterator<Container>& operator++() 0&zp9(G5  
{ @N34 Q-l  
m_index++; <.#i3!  
return *this; fi`*r\  
} C4ge_u#  
bit_iterator<Container>& operator++(int) ``U>9S"p)  
{ MK,#"Ty}zK  
m_index++; ONg_3vD{  
return *this; GkVV%0;&J1  
} CPAizS  
bool operator==(bit_iterator<Container>& bitIt) t '* L,  
{ ^k/@y@%  
return m_index == bitIt.m_index; dCN4aY[d  
} kowBB0  
bool operator!=(bit_iterator<Container>& bitIt) G8 H=xr#  
{ </Ja@%  
return !(*this == bitIt); |G } qY5_  
} 5Q =o.wf  
protected: |}=xA%)  
Container* m_container; bt"*@NJ$  
private: \K55|3~R  
int m_size; Xbe=_9l&p  
int m_index; Sw%^&*J  
}; /GqW1tcO  
+uLl3(ml  
用该迭代器可以将任意类型对象以二进制格式输出: sBt,y _LW  
double a = 10; -6@#Nq_iWU  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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