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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 mWv3!i;G<s  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 q?Cnav`DY  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 n#cC+>*>+  
象当作char数组来处理。 %7QV&[4!  
template<class Container> # ncRb  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, l.(v^3:X  
void, void> *o]L|Vu  
{ > ;jZa  
public: |+{)_?  
explicit bit_iterator(Container& c) : m_container(&c) ?'IP4z;y  
{ C/_ZUF(V  
m_size = 8*sizeof(Container); @hl.lq  
m_index = 0; /~DI 6g  
} fPU`/6  
explicit bit_iterator() : m_container(0) k}S :RK  
{ _;W.q7 b]  
m_size = 8*sizeof(Container); {k(g]#pP  
m_index = m_size; @g|v;B|{  
} u/UrAqw  
bool operator* () 2_)\a(.Qu  
{ {WJm  
char mask = 1; G5{T5#  
char* pc = (char*)m_container; W=ig.-  
int i   = (m_size-m_index-1)/8; <'}YyU=  
int off   = (m_size-m_index-1)%8; *HU &4E\a  
mask <<=off; #`~C)=-  
return pc & mask; +<'Ev~  
} pLl(iNf]  
bit_iterator<Container>& operator++() s'3 s^Dd  
{ We)xB  
m_index++; oph}5Krd)  
return *this; ;^+\K-O]c  
} H h4WMZJG  
bit_iterator<Container>& operator++(int) c& < Fr[AK  
{ &g#@3e1>  
m_index++; }?lrU.@zg  
return *this; []D&bYpv  
} t1]K<>g  
bool operator==(bit_iterator<Container>& bitIt) 3v(*5  
{ 9/9j+5}+  
return m_index == bitIt.m_index; ;$HftG>B  
} .28<tEf  
bool operator!=(bit_iterator<Container>& bitIt) YP 6` L  
{ -<6\1J  
return !(*this == bitIt); 1eA7>$w}[  
} QemyCCP+  
protected: fAF1"4f  
Container* m_container; S2E8G q9  
private: 7 G)ZN{'  
int m_size; 65L6:}#  
int m_index; }#3V+X  
}; B)$| vK=  
y@1+I ~@  
用该迭代器可以将任意类型对象以二进制格式输出: >d@&2FTO  
double a = 10; 2{D{sa  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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