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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 +EjXoW7V  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 OK v2..8  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 O [= L#wi  
象当作char数组来处理。 c BqbbZyUk  
template<class Container> [R1|=kGU  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ~ S<aIk0l  
void, void> 842v^ 2  
{ lusUmFm'*  
public: Y2tVq})!  
explicit bit_iterator(Container& c) : m_container(&c) C9?mxa*z  
{ Wu* 4r0  
m_size = 8*sizeof(Container); "Y^j=?1k  
m_index = 0; Mi#i 3y(  
} Xg]Cq"RJC  
explicit bit_iterator() : m_container(0) U2?R&c;b  
{ $)@D(m,ybd  
m_size = 8*sizeof(Container); @;Jv/N6@  
m_index = m_size; kJl^,q  
} u=Ik&^v Wq  
bool operator* () s<"|'~<n  
{ h2x9LPLBxT  
char mask = 1; PX/Y?DP  
char* pc = (char*)m_container; ?o.d FKUe  
int i   = (m_size-m_index-1)/8; 5qH*"i+|s  
int off   = (m_size-m_index-1)%8; ]QHp?Ii1  
mask <<=off; Q*I8RAfd  
return pc & mask; ;<m*ASM.3  
} lCUYE"o  
bit_iterator<Container>& operator++() \,Ws=9f  
{ qJT/4 8lf_  
m_index++; 7'e sJ)2  
return *this; AB\Ya4O"9  
} a(6h`GHo  
bit_iterator<Container>& operator++(int) &-qQF`7  
{ (_4DZMf  
m_index++; pl3ap(/  
return *this; 9vyf9QE;  
} wdP(MkaV  
bool operator==(bit_iterator<Container>& bitIt) 6d/Q"As  
{ b MD|  
return m_index == bitIt.m_index; r!f UMDS  
} 5b/ ~]v  
bool operator!=(bit_iterator<Container>& bitIt) E\DA3lq  
{ B VeMV4  
return !(*this == bitIt); wHs1ge(  
} o$</At  
protected: Le?g ,c  
Container* m_container; 8cOft ;|qB  
private: ' m~=sC_uL  
int m_size; sw}O g`U  
int m_index; Wgh@XB  
}; S=-$:65  
;<Z6Y3>I8  
用该迭代器可以将任意类型对象以二进制格式输出: k*)sz  
double a = 10; Kw`CN  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八