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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 AW68'G*m  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 I%xJ)fIK  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 c>.Xc[H  
象当作char数组来处理。 f d5~'2  
template<class Container> X|G+N(`|(  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Ry3 f'gx  
void, void> 9B0"GEwrs  
{ [hbIv   
public: pQ8+T|0x  
explicit bit_iterator(Container& c) : m_container(&c) GrC")Z|3u  
{ 7C^ nk z  
m_size = 8*sizeof(Container); OSk9Eb4ld  
m_index = 0; h (2k;M^s  
} gp2)35  
explicit bit_iterator() : m_container(0) {*Pp^ r  
{ ![%,pip2/&  
m_size = 8*sizeof(Container); b"9,DQB=i  
m_index = m_size; N4-J !r@#~  
} ,iUx'U  
bool operator* () 4pv :u:Z  
{ #m>mYp8E.5  
char mask = 1; q5PYc.E([  
char* pc = (char*)m_container; 3}Qh`+Yj]  
int i   = (m_size-m_index-1)/8; K4~O x  
int off   = (m_size-m_index-1)%8; 5Bo)j_Qo  
mask <<=off; Fwqf4&/  
return pc & mask;  qI@_  
} q#Vf2U55m  
bit_iterator<Container>& operator++() O!tD1^O!1}  
{ :_ox8xS4  
m_index++; ls Ch K  
return *this; gZv <_0N  
} Hc9pWr "N  
bit_iterator<Container>& operator++(int) EVsZ:Ra^k  
{ t;3.;  
m_index++; Y[4B{  
return *this; ow "Xv  
} ;0'v`ob'.?  
bool operator==(bit_iterator<Container>& bitIt) Z ngJ9js  
{ UepBXt3)  
return m_index == bitIt.m_index; +_Z/VQv  
} _!zY(9%  
bool operator!=(bit_iterator<Container>& bitIt) 3FN? CN] O  
{ 3LR Eue7Gr  
return !(*this == bitIt); RSC-+c6 1  
} _(foJRr  
protected: s=4.Ovd\  
Container* m_container; +&@0;zSga  
private: UEUTu}4y  
int m_size; eHR<(8c'f  
int m_index; pJ[Q.QxU  
}; iXFaQ  
9K!='u`  
用该迭代器可以将任意类型对象以二进制格式输出: .2xkf@OP  
double a = 10; 2X_ef  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八