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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Uvc$&j^k  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。  *BM#fe  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 "?aI  
象当作char数组来处理。 &{<hY|%  
template<class Container> UNiK6h_%  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, T _UJ?W  
void, void> n^|xp;] :  
{ l/nBin&YGv  
public: zvq}7,  
explicit bit_iterator(Container& c) : m_container(&c) 3ww\Z8UeK  
{ jLM y27Cn  
m_size = 8*sizeof(Container); McS]aJfrk  
m_index = 0; DHeZi3&i  
} k+"7hf=C|  
explicit bit_iterator() : m_container(0) FF^h(Ea  
{ WH39=)D%u  
m_size = 8*sizeof(Container); VKYljY0#  
m_index = m_size; 5+oY c-  
} WW6-oQs_#*  
bool operator* () $]};EI#  
{ [$d]U.  
char mask = 1; (b[=~Nh'  
char* pc = (char*)m_container; 9__Q-J  
int i   = (m_size-m_index-1)/8; *}#HBZe(9  
int off   = (m_size-m_index-1)%8; ,38M6yD  
mask <<=off; [ypE[   
return pc & mask; gk?H@b*  
} ,ZY\})`p  
bit_iterator<Container>& operator++() +eH`mI0f  
{ ?,v& o>*  
m_index++; |k]]dP|:'  
return *this; #tsP  
} r|uR!=*|?  
bit_iterator<Container>& operator++(int) [hot,\+f  
{ 7CF>cpw  
m_index++; bw/mF5AsW  
return *this; ]:2Ro:4Yv  
} 9$9a BW  
bool operator==(bit_iterator<Container>& bitIt) tzgaHN  
{ GoX<d{  
return m_index == bitIt.m_index; ALO/{:l(  
} NPO!J^^  
bool operator!=(bit_iterator<Container>& bitIt) rc>}3?o  
{ h\Y~sm?!`  
return !(*this == bitIt); 3"my!}03  
} ZR|s]'  
protected: />:$"+gKo  
Container* m_container; jp~Tlomp  
private: C{t}q*fG 5  
int m_size; Df2$2VU  
int m_index; ZR)M<*$  
}; Jc5Y Gj7  
ir\)Hz2P  
用该迭代器可以将任意类型对象以二进制格式输出: nI(w7qhub  
double a = 10; `\ IaeMvo  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
10+5=?,请输入中文答案:十五