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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 @9|hMo  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 |! "eWTJ  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 6D_D';o  
象当作char数组来处理。 | VDV<g5h  
template<class Container> IO:G1;[/2L  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Y\'}a+:@Ph  
void, void> Wh{tZ~c  
{ %e} Saf  
public: bi;1s'Y<D  
explicit bit_iterator(Container& c) : m_container(&c) g< .qUBPKX  
{ Rbv;?'O$L  
m_size = 8*sizeof(Container);  "-V"=t'  
m_index = 0; o#1 $q`Z  
} Eu04e N  
explicit bit_iterator() : m_container(0) JOBhx)E  
{ [z9Z5sLO  
m_size = 8*sizeof(Container); '@P^0+B!(.  
m_index = m_size; KJZ4AWH`  
} +m,yA mEEd  
bool operator* () 2^yU ~`#  
{ iO; 7t@]-  
char mask = 1; ,~W|]/b<q  
char* pc = (char*)m_container; FJ?IUy 6  
int i   = (m_size-m_index-1)/8; %ULr8)R;  
int off   = (m_size-m_index-1)%8; Dv`c<+q(#  
mask <<=off; \xoP)Ub>  
return pc & mask; e\75:oQ  
} X)3!_  
bit_iterator<Container>& operator++() R ViuJ;  
{ }*"p?L^p{  
m_index++; Kx JqbLUC  
return *this; II x#2r  
} uY'HT|@:{  
bit_iterator<Container>& operator++(int) ^K@C"j?M/  
{ ` sU/&  P  
m_index++; H} g{Cr"Ex  
return *this; @Do= k  
} ;sFF+^~L  
bool operator==(bit_iterator<Container>& bitIt) VVOd]2{  
{ 3sZ\0P}   
return m_index == bitIt.m_index; ,s;Uf F  
} 5l*&>C[(i  
bool operator!=(bit_iterator<Container>& bitIt) G,w(d@  
{ Thit  
return !(*this == bitIt); VY\&8n}e(  
} SasJic2M  
protected: <Q?F?.^e  
Container* m_container; $iz|\m  
private: 4+ Z]3oIRE  
int m_size; 5/Uy{Xt  
int m_index; 7D5]G-}x.  
}; H<N,%G  
lHX72s|V  
用该迭代器可以将任意类型对象以二进制格式输出: b;UJ 88  
double a = 10; b|W=pSTY  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八