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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 a*?,wmzl  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 O^4K o}  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ''wF%q  
象当作char数组来处理。 ;op 8r u  
template<class Container> *!u a?  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ? q hme   
void, void> J}s)#va9R  
{ > 72qi*0  
public: N}7tjk   
explicit bit_iterator(Container& c) : m_container(&c) 22"/|S  
{ u|8yV.=R  
m_size = 8*sizeof(Container); (Q6}N'T  
m_index = 0; LE@`TPg$R  
} QiQO>r  
explicit bit_iterator() : m_container(0) 'fIirGOl  
{ -\~D6OA  
m_size = 8*sizeof(Container); oWdvpvO  
m_index = m_size; r^!P=BS{  
} ZH=oQV)6  
bool operator* () 28d=-s=[  
{ aDE)Nf}  
char mask = 1; `"<tk1Kq"  
char* pc = (char*)m_container; P:2 0i*QU  
int i   = (m_size-m_index-1)/8; Oz7WtN  
int off   = (m_size-m_index-1)%8; TkV*^j5  
mask <<=off; e"6!0Py#*  
return pc & mask; 2B&|0&WI  
} s(M8 Y  
bit_iterator<Container>& operator++() x)!NB99(tC  
{ I:,D:00+  
m_index++; Wo~#R   
return *this; y1+~IjY  
} yf7$m_$C'  
bit_iterator<Container>& operator++(int) MYF6tZ*  
{ 9UeK}Rl^n  
m_index++; |\S p IFH1  
return *this; b+ J)  
} Vq1v e;(8s  
bool operator==(bit_iterator<Container>& bitIt) kc-v(WIC  
{ 1U;p+k5c  
return m_index == bitIt.m_index; pm}!?TL  
} j?'It`s  
bool operator!=(bit_iterator<Container>& bitIt) K(B|o6[  
{ 4^Ghn  
return !(*this == bitIt); :s`\jJ  
} }dO^q-t$3  
protected: ( mKuFz7  
Container* m_container; 7!-y72qx  
private: 0s8w)%4$  
int m_size; ZdY)&LJ  
int m_index; l-RwCw4f  
}; "1Oe bo2  
#jNN?,ZK  
用该迭代器可以将任意类型对象以二进制格式输出: 3erGTa[|q  
double a = 10; 5cE?>  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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