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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 g_5:o 3s  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 TBvv(_  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 VLkK6W.u  
象当作char数组来处理。 =0MW+-  
template<class Container> O.  V!L  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, &iId<.SiJ  
void, void>  5!NK  
{ sn]8h2z  
public: C$b$)uI;  
explicit bit_iterator(Container& c) : m_container(&c) 39BGwKXb  
{ N?ky2wG  
m_size = 8*sizeof(Container); =VH, i/@  
m_index = 0; Cn[`]  
} S6 `4&0'  
explicit bit_iterator() : m_container(0) AFF7fK  
{ #xNLr   
m_size = 8*sizeof(Container); qR--lvO  
m_index = m_size; 5NZob<<  
} oZA?}#DRl  
bool operator* () Yvcd(2  
{ dl6d!Nz*  
char mask = 1; bN8GRK )  
char* pc = (char*)m_container; ??CtmH  
int i   = (m_size-m_index-1)/8; l+*^P'0u  
int off   = (m_size-m_index-1)%8; S=n,unn#t  
mask <<=off; CVyqr_n65/  
return pc & mask; @K7#}7,t  
} 2fu|X#R  
bit_iterator<Container>& operator++() 7xb z)FI  
{ weEmUw Z  
m_index++; :lcZ )6&S  
return *this; Vp  .($  
} D ?1$I0=  
bit_iterator<Container>& operator++(int) ?J<Y]  
{ >sv|  
m_index++; QU2\gAM  
return *this; I!%T!B540  
} =cs;avtL  
bool operator==(bit_iterator<Container>& bitIt) w*Vf{[a'  
{ #joGIw  
return m_index == bitIt.m_index; <]r.wn=}M  
} `7zz&f9dDX  
bool operator!=(bit_iterator<Container>& bitIt) (Eq0 |"cj  
{ ,[7 1,zs  
return !(*this == bitIt); WoHFt*e2  
} <.s=)}'`P  
protected: Iw(deD  
Container* m_container; g 7res  
private: %3M(!X:[  
int m_size; $?YRy_SI  
int m_index; JV=d!Gi[C  
}; ( 1T2? mO  
,i lVt  
用该迭代器可以将任意类型对象以二进制格式输出: aT$q1!U`j2  
double a = 10; ]1>U@oK  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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