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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 nYgx9Q"<om  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %N1T{   
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 LNbx3W oC  
象当作char数组来处理。 y,1S& k  
template<class Container> l [x%I  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ew/KZE  
void, void> iF+S%aPd#  
{ LP8o7%sv!  
public: AV9:O{  
explicit bit_iterator(Container& c) : m_container(&c) bL#sn_(m  
{  ,&4zKm  
m_size = 8*sizeof(Container); e$x4Ux7*"  
m_index = 0; bQ i<0|S  
} Y9/{0TArG  
explicit bit_iterator() : m_container(0) X #H:&*[!  
{ S54gqc1S]  
m_size = 8*sizeof(Container); pEJ#ad  
m_index = m_size; /1H9z`qV  
} <)=3XEcb  
bool operator* () )|MIWgfWN  
{ Cd$dn HVh  
char mask = 1; .$n$%|"H-  
char* pc = (char*)m_container; oPp!*$V  
int i   = (m_size-m_index-1)/8; |2[S/8g!  
int off   = (m_size-m_index-1)%8; b "`ru~]  
mask <<=off; {c&qB`y<.  
return pc & mask; .Gjr`6R  
} J~M H_N  
bit_iterator<Container>& operator++() cA2^5'$$  
{ Omp i~  
m_index++; M9g~lKs'  
return *this; t$ACQ*O  
} N`y}Gs  
bit_iterator<Container>& operator++(int) Fc34Y0_A  
{ 'Wo?%n  
m_index++; Mb2:'u [  
return *this; ]J8KCjq@  
} OHx,*}N  
bool operator==(bit_iterator<Container>& bitIt)  Dlqn~  
{ OL,/-;z6  
return m_index == bitIt.m_index; V)_H E  
} wrZ7Sr!/V  
bool operator!=(bit_iterator<Container>& bitIt) #i}#jMT  
{  '7S!6kd?  
return !(*this == bitIt); _"R3N  
} e; &{50VY  
protected: GoGohsj  
Container* m_container; R=#q"9qz  
private: l(3'Re  
int m_size; "ZA$"^  
int m_index; CF4Oh-f  
}; "z{_hp{T^  
X+?Il)Bv  
用该迭代器可以将任意类型对象以二进制格式输出: Z`SWZ<  
double a = 10; ;PP_3`  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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