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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 HNBmq>XDc  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 `m<O!I"A  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ^4"AWps  
象当作char数组来处理。 Q]N&^ E  
template<class Container> 81s }4  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, g([:"y?  
void, void> `=#jWZ.8m  
{ A7+ZY,  
public: JVy|SA&R  
explicit bit_iterator(Container& c) : m_container(&c) 0<~~0US  
{ $;q }j vo  
m_size = 8*sizeof(Container); $VF,l#aR  
m_index = 0; e]88 4FP  
} o#f"wQH;p  
explicit bit_iterator() : m_container(0) ycc G>%>r  
{ LAxN?ok9gD  
m_size = 8*sizeof(Container); H2Wlgt  
m_index = m_size; 8^j~uH  
} j+ -r(lZ  
bool operator* () 0: hv6Ge^  
{ YuknZ&Q  
char mask = 1; ~:T@SrVI  
char* pc = (char*)m_container; 2m yxwA5  
int i   = (m_size-m_index-1)/8; b=:ud[h  
int off   = (m_size-m_index-1)%8; 04;s@\yX4  
mask <<=off; 4FRi=d;mP  
return pc & mask; ~,1Sw7 rE  
} -X$EE$:  
bit_iterator<Container>& operator++() wxh\CBxG  
{ Fl=H5HR  
m_index++; UiH7  
return *this; h^tCF=S  
} a6DR' BC  
bit_iterator<Container>& operator++(int) *1`X}  
{ b1 w@toc  
m_index++; .aY $-Y<  
return *this; !KK`+ 9/  
} c5WMN.z  
bool operator==(bit_iterator<Container>& bitIt) pl&nr7\  
{ Uz!3){E  
return m_index == bitIt.m_index; Jk\-e`eE  
} #d\&6'O  
bool operator!=(bit_iterator<Container>& bitIt) S5 q1M n  
{ HBE[q#  
return !(*this == bitIt); bT2G G  
} \N0vA~N.  
protected: uWdF7|PN7  
Container* m_container; 04|ZwX$>+  
private: <.4(#Ebd  
int m_size; Bgc]t  
int m_index; <F0^+Pf/  
}; EA6l11{Gk1  
o$.#A]Flb  
用该迭代器可以将任意类型对象以二进制格式输出: H"AL@=  
double a = 10; ")uKDq  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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