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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 { Em fw9L  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Z E},x U%  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 aK'%E3!~=x  
象当作char数组来处理。 8$6^S{M3  
template<class Container> xz vbjS W  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, vA@\V)s  
void, void> EY.Z.gMZI(  
{ @ u2 P&|:{  
public: #,\qjY  
explicit bit_iterator(Container& c) : m_container(&c) c_.4~>qw  
{ vsCy?  
m_size = 8*sizeof(Container); &UoQ8&  
m_index = 0; ;rJ/Diz!g  
} 7T9Mo .  
explicit bit_iterator() : m_container(0)  *4{GI D  
{ $pYT#_P!/  
m_size = 8*sizeof(Container); )?,X\/5  
m_index = m_size; Hd0?}w\  
} A>Oi9%OY:  
bool operator* () )R9QJSe  
{ rtgu{m02  
char mask = 1; /-&a]PJ  
char* pc = (char*)m_container; 1 c4I`#_v  
int i   = (m_size-m_index-1)/8; ~z*A%vp6ER  
int off   = (m_size-m_index-1)%8; orr6._xw  
mask <<=off; 8>~\R=SC  
return pc & mask; JnZlz?}^  
} [n9X5qG~  
bit_iterator<Container>& operator++() *D$Hd">X  
{ F\hU V[  
m_index++; b:>t1S Ul  
return *this; FaE,rzn)iD  
} jMB&(r  
bit_iterator<Container>& operator++(int) !&8HA   
{ xO` O$ie  
m_index++; #MI4 `FZ  
return *this; IAa}F!6Q1  
} !S}4b   
bool operator==(bit_iterator<Container>& bitIt) *u`[2xmuYf  
{ o+.LG($+U  
return m_index == bitIt.m_index; >ay% !X@3"  
} IA?v[xu  
bool operator!=(bit_iterator<Container>& bitIt) Z{J{6j  
{ M?zwXmTVW0  
return !(*this == bitIt); ]W>kbH Imz  
} 9 54O=9PQ  
protected: dw e$, 9  
Container* m_container; \4pWHE/  
private: W_P&;)E  
int m_size; Z4'8x h)-  
int m_index; BD (  
}; @ wJ|vW_.  
j_2yTz"G-  
用该迭代器可以将任意类型对象以二进制格式输出: 2n8spLZYGY  
double a = 10; I w-3Z'hOX  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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