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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {#U 3A_y  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 @{V bu  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对  :d) y  
象当作char数组来处理。 ag02=}Q'r  
template<class Container> RwyX,|  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, *TyLB&<t  
void, void> 9@3cz_[J  
{ " i!Xiy~  
public: omu )s '8  
explicit bit_iterator(Container& c) : m_container(&c) y <] x  
{ XU5GmGu_+  
m_size = 8*sizeof(Container); W6^YFN  
m_index = 0; 4"^v]&I  
} 7ILb&JQ!%{  
explicit bit_iterator() : m_container(0) JfLoGl;p m  
{ .(g"(fgF  
m_size = 8*sizeof(Container); nG4}8  
m_index = m_size; }kZ)|/]kn  
} i K,^|Q8  
bool operator* () |\BxKwS^  
{ \DMZ M  
char mask = 1; IRG-H!FV  
char* pc = (char*)m_container; .dPy<6E  
int i   = (m_size-m_index-1)/8; T/$hN hQK  
int off   = (m_size-m_index-1)%8; 1c4@qQyo  
mask <<=off; ]5a,%*f+  
return pc & mask; NTV@,  
} 8, " 5z_  
bit_iterator<Container>& operator++() wX+KW0|>  
{ 4Ai#$SHLm  
m_index++; wl5+VC*l0  
return *this; 0zc~!r~  
} |C`.m |  
bit_iterator<Container>& operator++(int) wOV}<.W  
{ #-7w |  
m_index++; \5DOp-2  
return *this; x5(B(V@b  
} \Xpq=2`  
bool operator==(bit_iterator<Container>& bitIt) 0eFvcH:qG  
{ } m&La4E  
return m_index == bitIt.m_index; FA$1&Fu3Y  
} St|B9V?eEB  
bool operator!=(bit_iterator<Container>& bitIt) Jty/gjK+  
{ eh /QFm 4  
return !(*this == bitIt); d>hLnz1O  
} w$$vR   
protected: snvixbN  
Container* m_container; 'Ivr =-  
private: _ lE d8Cb  
int m_size; dkAY%ztwo  
int m_index; T{4Ru6[  
}; u(C?\HaH  
"yf#sEabV  
用该迭代器可以将任意类型对象以二进制格式输出: \9%RY]TK3  
double a = 10; [DSD[[ z[  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八