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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 qG~6YCqii  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 8n2;47 a  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 UYy #DA  
象当作char数组来处理。 {=J:  
template<class Container> }C[ "'tLX  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, EAWBgOO8iC  
void, void> %}~(%@qB>+  
{ |9FrVO$M  
public: UNv!G/i-5  
explicit bit_iterator(Container& c) : m_container(&c) /7+b.h])^  
{ !L9]nO 'BL  
m_size = 8*sizeof(Container); c}),yQ|!:  
m_index = 0; yEh{9S%6p  
} n dN*X'  
explicit bit_iterator() : m_container(0) >hG*=4oh  
{ 87S,6Y  
m_size = 8*sizeof(Container); x}WP1YyT~  
m_index = m_size; ;[P>  
} 5f0g7w =-  
bool operator* () #M#$2Vt  
{ x)$0Nr62D  
char mask = 1; :p)^+AF"5  
char* pc = (char*)m_container; M5:*aCN6P  
int i   = (m_size-m_index-1)/8; jVoD9H F/  
int off   = (m_size-m_index-1)%8; iY,oaC~?"N  
mask <<=off; qZV|}M>P)  
return pc & mask; g;[t1~oF  
} ofz?L#:2  
bit_iterator<Container>& operator++() '+iLW~   
{ ;0 +Dx~  
m_index++; km^ZF<.@  
return *this; <ycR/X  
} o F_{oV '  
bit_iterator<Container>& operator++(int) Y1ca=ewFx  
{ d9jD?HgM(  
m_index++; sy4Nm0m  
return *this; ld({1jpX,  
} 1#AxFdm1  
bool operator==(bit_iterator<Container>& bitIt) _tje xS'  
{ .qYQ3G'V  
return m_index == bitIt.m_index; !:esdJH  
} L0=`1q  
bool operator!=(bit_iterator<Container>& bitIt) LLzxCMc9*  
{ UpSJ%%.n  
return !(*this == bitIt); Ijz*wq\s;  
} *M#L)c;6  
protected: 6;!)^b  
Container* m_container; #s>'IPc0  
private: jRDvVV/-wr  
int m_size; %{^|Av1Uz  
int m_index; qJonzFp7  
}; d, ?GW  
DVg$rm`  
用该迭代器可以将任意类型对象以二进制格式输出: ?Oy0p8  
double a = 10; cCx{ ")  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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