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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 |2UauTp5yK  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 u-/3(dKt  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 /Y^7Rl  
象当作char数组来处理。 c20|Cx2m  
template<class Container> .5k^f5a  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, M7H~;S\3IM  
void, void> xucIjPi]  
{ .%hQJ{vf-^  
public: wR1K8b".DC  
explicit bit_iterator(Container& c) : m_container(&c) wG6FS  
{ "w1(g=n  
m_size = 8*sizeof(Container); XkoWL  
m_index = 0; ,yi2O]5e>!  
} vcD'~)G(*  
explicit bit_iterator() : m_container(0) g&aT!%QvX+  
{ W,'3D~g8  
m_size = 8*sizeof(Container); o;'4c  
m_index = m_size; fsb=8>}63}  
} Pu/lpHm|  
bool operator* () =[8d@d\  
{ QW:Z[?39^  
char mask = 1; 0JOju$Bl,  
char* pc = (char*)m_container; _9qEZV  
int i   = (m_size-m_index-1)/8; i-Ljff  
int off   = (m_size-m_index-1)%8; I9s$bRbT  
mask <<=off; Q~CpP9%  
return pc & mask; 8ok7|DJ  
} z5I^0'  
bit_iterator<Container>& operator++() Lj-{t% }  
{ $ACe\R/%  
m_index++; 8|_K  
return *this; dTgM"k  
} 6 cr^<]v!  
bit_iterator<Container>& operator++(int) Uc>LFX& -B  
{ o[H\{a>  
m_index++; |<2JQ[]  
return *this; iqlVlm>E  
} IM|Se4;x  
bool operator==(bit_iterator<Container>& bitIt) @%keTTZ  
{ t;~-_{  
return m_index == bitIt.m_index; FrgV@4'2G  
} kt5YgW  
bool operator!=(bit_iterator<Container>& bitIt) $/y%[ .  
{ 7@\GU]. 2  
return !(*this == bitIt); #s/{u RYQ  
} hG[4O3jo\  
protected: c8!j6\dC*  
Container* m_container; )m>6hk  
private: Wpa$B )xg  
int m_size; EsNk<Ra  
int m_index; PH{ c,  
}; 4jPwL|#  
{K6Kx36  
用该迭代器可以将任意类型对象以二进制格式输出: 's/27=o  
double a = 10; \Z8Y(]6*  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八