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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 oIxH3T  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 rJV?) =Z  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 7Ud'd<  
象当作char数组来处理。 wv^b_DR  
template<class Container> n1 v,#GE  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, W>$BF[x!{  
void, void> c/'M#h)"  
{ !g2a|g   
public: <4f,G]UH_  
explicit bit_iterator(Container& c) : m_container(&c) i| 4_ m  
{ F`srE6H  
m_size = 8*sizeof(Container); GoD ?KC  
m_index = 0; H&K3"Ulw  
} ` FxtLG,F  
explicit bit_iterator() : m_container(0) y ||@?Y  
{ blp=Hk  
m_size = 8*sizeof(Container); vgo{]:Aj{  
m_index = m_size; Q!]IG;3Sx|  
} zX~}]?|9  
bool operator* () u~}%1  
{ <r;o6>+  
char mask = 1; +6376$dC  
char* pc = (char*)m_container; 3agNBF2  
int i   = (m_size-m_index-1)/8; i@6wO?Tv  
int off   = (m_size-m_index-1)%8; <I 1y  
mask <<=off; $',3Pv  
return pc & mask; I.9o`Q[8&  
} qguVaV4Y  
bit_iterator<Container>& operator++() Z(UD9wY5m  
{ *%?d\8d  
m_index++; _>i|s|aW  
return *this; Y }/c N\  
} k9&@(G[K3  
bit_iterator<Container>& operator++(int) SB1[jcJ  
{ VF= Z`  
m_index++; I+~bCcgPi  
return *this; 1 7i$8  
} OAVQ`ek  
bool operator==(bit_iterator<Container>& bitIt) 6Hn)pD#U  
{ ob]dZ  
return m_index == bitIt.m_index; _uJVuCc  
} 8nsZ+,@+[  
bool operator!=(bit_iterator<Container>& bitIt) avBua6i'  
{ L~ 2q1  
return !(*this == bitIt); (Y)!"_|  
} ~v\hIm3=m  
protected: RM#fX^)=  
Container* m_container; zLK\I~rU!  
private: 3G.r-  
int m_size; avy=0Jmj  
int m_index; J&_3VKrN  
}; Jh^8xI,`C  
)Oe`s(O@[I  
用该迭代器可以将任意类型对象以二进制格式输出: N33AcV!*8  
double a = 10; Wxs>osq  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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