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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 y^:N^Gt  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Lj2Au_5  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 l1UN.l'p  
象当作char数组来处理。 $N/"c$50,  
template<class Container> \f4JIsZ-&  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, #-7w |  
void, void> \5DOp-2  
{ -izZ D  
public: ana?;NvC  
explicit bit_iterator(Container& c) : m_container(&c) ydMfV-  
{ ?#gYu %7DN  
m_size = 8*sizeof(Container); }@TtX\7(D  
m_index = 0; "JpnmE[`  
} <sor;;T  
explicit bit_iterator() : m_container(0) wS;hC&~2  
{ N VBWF  
m_size = 8*sizeof(Container); T:0#se  
m_index = m_size; `VXC*A   
} ay>u``$R  
bool operator* () Al^h^ 9tJ  
{ q~6((pWi|  
char mask = 1; eUEO~M2&U{  
char* pc = (char*)m_container; VWT\wA L  
int i   = (m_size-m_index-1)/8; V1 O]L66  
int off   = (m_size-m_index-1)%8; (aX6jdvo  
mask <<=off; uTvck6  
return pc & mask; cIOM}/gqv  
} %y[ t+)!E  
bit_iterator<Container>& operator++() dS)c~:&+  
{ IgNL1KRD  
m_index++; 2>'/!/+R  
return *this; CAtdx!  
} IiB"F<&[j{  
bit_iterator<Container>& operator++(int) %dDwus  
{ $zD}hO9  
m_index++; o 4cqLM u  
return *this; o}6d[G>  
} ,+o*>fD  
bool operator==(bit_iterator<Container>& bitIt) 5o2|QL  
{ a9niXy}a(  
return m_index == bitIt.m_index; hM~zO1XW  
} We:b1sZR  
bool operator!=(bit_iterator<Container>& bitIt) #n6<jF1G  
{ s*UO!bHa  
return !(*this == bitIt); 3}V -'!  
} MtXTh*4  
protected: xAJuIR1Hi  
Container* m_container; <p\iB'y  
private: HWxwG'EEY,  
int m_size; sFa5#w*>  
int m_index; Ika(ip#]=  
}; Fpckb18}(O  
C ]+J  
用该迭代器可以将任意类型对象以二进制格式输出: @ !m+s~~]h  
double a = 10; m+'vrxTY  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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