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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 P`oR-D  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 $`5DGy?RU  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 _E "[%  
象当作char数组来处理。  ?Z!KV=  
template<class Container> I3L1|!  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, x[?_F  
void, void> wXZ-%,R -D  
{ ::5-UxGL<2  
public: P#0 _  
explicit bit_iterator(Container& c) : m_container(&c) FE5R ^W#u-  
{ y%GV9  
m_size = 8*sizeof(Container); MUo?ajbqOd  
m_index = 0; D{4 Y:O&J  
} e-s@@k  
explicit bit_iterator() : m_container(0) Vnl~AQfk|  
{ \vT8 )\  
m_size = 8*sizeof(Container); ^ ID%pd  
m_index = m_size; m:^@AR1%d  
} Kr#=u~~M  
bool operator* () %sq=lW5R{b  
{ _ <~05Eh  
char mask = 1; '0=U+Egp  
char* pc = (char*)m_container; 4 '+)9&g  
int i   = (m_size-m_index-1)/8; ~W#f,mf  
int off   = (m_size-m_index-1)%8; $K iMu  
mask <<=off; kQb0pfYs  
return pc & mask; QxkfP%_g  
} :C&?(HJ&r  
bit_iterator<Container>& operator++() af_zZf!0  
{ _m&VdIPO  
m_index++; zZRqb/20  
return *this; j[HKC0C6  
} 42C:cl} ."  
bit_iterator<Container>& operator++(int) ZD<,h` lZ  
{ *dQRs6  
m_index++; J\%:jg( m  
return *this; 0N}5sF  
} u,pm\  
bool operator==(bit_iterator<Container>& bitIt) @Yg7F>s  
{ kj8zWG4KH  
return m_index == bitIt.m_index; `SG70/  
} gPf aiVY  
bool operator!=(bit_iterator<Container>& bitIt) <V, ?!}V  
{ l&rDa=m.J  
return !(*this == bitIt); [0}471  
} :X!(^ a;]  
protected: b^xf ,`D  
Container* m_container; :@/fy}!  
private: pqs)ueu  
int m_size; }/LYI  
int m_index; I*ej_cFQ^  
}; _c&*'IY[V  
YO Y+z\Q  
用该迭代器可以将任意类型对象以二进制格式输出: Q(sbClp"  
double a = 10; X1-s,[j'  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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