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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 $Wj{B@k  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 &V$cwB  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 WZn;u3,R  
象当作char数组来处理。 ;Ivv4u  
template<class Container> %(p9AE  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, `ovMfL.u  
void, void> KJ32L  
{ Q"D  
public: j0~am,yZ  
explicit bit_iterator(Container& c) : m_container(&c) jT$J~M pHh  
{ 6xtgnl#T  
m_size = 8*sizeof(Container); uA[ :  
m_index = 0; TP {\V>*Yz  
} CEkUXsp  
explicit bit_iterator() : m_container(0) bRyxP2  
{ ym%` l!  
m_size = 8*sizeof(Container); 1E / G+pm  
m_index = m_size; qpjZ-[UC  
} U m\HX6  
bool operator* () .=Oww  
{ A03io8D6  
char mask = 1; Gv G8s6IZ  
char* pc = (char*)m_container; L~{(9J'(  
int i   = (m_size-m_index-1)/8; MXfyj5K  
int off   = (m_size-m_index-1)%8; @(35I  
mask <<=off; r>ed/<_>m;  
return pc & mask; keRLai7h  
} 0C%IdV%CU  
bit_iterator<Container>& operator++() lSaX!${R'T  
{ yc?L OW0  
m_index++; #J3o~,t<  
return *this; \P+^BG!  
} $%\6"P/64  
bit_iterator<Container>& operator++(int) qMVuFw Phi  
{ !;(Wm6~*ad  
m_index++; h[iO'Vq  
return *this; kN1R8|pv  
} "*D9.LyM  
bool operator==(bit_iterator<Container>& bitIt) anpKW a  
{ g$#A'Du  
return m_index == bitIt.m_index; "Y L^j~A  
} t?-a JU  
bool operator!=(bit_iterator<Container>& bitIt) r'#!w3*Cy  
{ Qd YYWD   
return !(*this == bitIt); u28$V]  
} JD0s0>q_  
protected: aV|V C $  
Container* m_container; h M7 SGEV  
private: 9#P~cW?  
int m_size; y7:f^4  
int m_index; K/Yeh<_&  
}; ![ce }  
y[.lfW?)  
用该迭代器可以将任意类型对象以二进制格式输出: 467"pqT  
double a = 10; UakVmVN/P  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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