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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 q35%t61Lc  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 BRD>q4w  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 r$G;^  
象当作char数组来处理。 Eu1s  
template<class Container> -}PD0Pzg;=  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, khc5h^0  
void, void> x\I9J4Q  
{ h, +2Mc<  
public: mY dU`j  
explicit bit_iterator(Container& c) : m_container(&c) pd>EUdbrp&  
{ BU]9eF!>h  
m_size = 8*sizeof(Container); @*A(#U8p3  
m_index = 0; O_(J',++  
} 1B,RRHXn6  
explicit bit_iterator() : m_container(0) Kd7OnU  
{ Ca?pK_Y  
m_size = 8*sizeof(Container); AO>K 6{  
m_index = m_size; C0KP,JS&  
} *kZJ  
bool operator* () ikyvst>O  
{ AkT_ZU>  
char mask = 1; m' z<d  
char* pc = (char*)m_container; <bIAq8  
int i   = (m_size-m_index-1)/8; k. px  
int off   = (m_size-m_index-1)%8; Z~muQ c?  
mask <<=off; *Fp )/Ih  
return pc & mask; tGv4 S\  
} ,i,f1XJ|  
bit_iterator<Container>& operator++() aMh2[I  
{ 1UxRN7  
m_index++; 7&|fD{:4U  
return *this; <P g.N  
} @0n #Qs|E!  
bit_iterator<Container>& operator++(int) ,f} s!>j  
{ fvN2]@:  
m_index++; is#?O5:2  
return *this; Kax85)9u  
} 0#XZ_(@%  
bool operator==(bit_iterator<Container>& bitIt) Gq+!%'][P  
{ c1jgBty  
return m_index == bitIt.m_index; vseuk@>  
} #sAEIk/  
bool operator!=(bit_iterator<Container>& bitIt) %|l*=v  
{ Wa ,[#H  
return !(*this == bitIt); _2U1$0xK  
} :N%]<Mq  
protected: o5 . q  
Container* m_container; <=^YIp  
private: +4B>gS[ F  
int m_size; AR/`]"'  
int m_index; 6ZCt xs!  
}; YI&^j2  
tw\/1wa.  
用该迭代器可以将任意类型对象以二进制格式输出: olQ;XTa01F  
double a = 10; \CU.'|X  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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