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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 lqKwjJ tX  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 v=H!Y";  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]j(Ld\:L  
象当作char数组来处理。  *8 ]  
template<class Container> :wJ!rn,4  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, cH7D@p}  
void, void> C%'eF`  
{ BimM)4g  
public: _j<,qi  
explicit bit_iterator(Container& c) : m_container(&c) BCH I@a  
{ Rh7=,=u  
m_size = 8*sizeof(Container); >2)!w  
m_index = 0; I3?:KVa  
} Os1y8ui  
explicit bit_iterator() : m_container(0) !i6 aA1'  
{ $Vm J[EF1  
m_size = 8*sizeof(Container); \y/+H  
m_index = m_size; <lLk (fC  
} k_Edug~B  
bool operator* () NO)vk+   
{ o6 [i0S  
char mask = 1; yM34GS=,J  
char* pc = (char*)m_container; '?!2h'  
int i   = (m_size-m_index-1)/8; bRAf!<3  
int off   = (m_size-m_index-1)%8; k?=V?JWY  
mask <<=off; JGk,u6K7  
return pc & mask; mH3{<^Z6  
} #D!3a%u0  
bit_iterator<Container>& operator++() k4nA+k<WI`  
{ iAW oKW  
m_index++; 6UJBE<ntj  
return *this; e3>k"  
} 5(OF~mX#  
bit_iterator<Container>& operator++(int) ~LzTqMHM  
{ ?jzadCel  
m_index++; gM3gc;  
return *this; w@ 2LFDp  
} Jh:-<xy)  
bool operator==(bit_iterator<Container>& bitIt) 5 *>3(U  
{ N:/$N@"Ge  
return m_index == bitIt.m_index; )uyh  
} <`m.Vbvm"  
bool operator!=(bit_iterator<Container>& bitIt) 'C*NyHc  
{ ByZ.!~  
return !(*this == bitIt); 4B}w;d@R  
} 9uREbip  
protected: >Y< y]vM:  
Container* m_container; E]Hl&t/}  
private: f1>^kl3@P  
int m_size;  g^E n6n)  
int m_index; ,K6]Q|U@r  
}; Y<.F/iaH  
9tC8|~Q  
用该迭代器可以将任意类型对象以二进制格式输出: z:R2Wksg  
double a = 10; Xc5[d`]  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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