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

以二进制格式输出对象

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 X6xx2v%D  
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 F<5nGx cC  
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 B#]_8svO  
象当作char数组来处理。 tVunh3-  
template<class Container> :y\09)CJK  
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Xem 05%,  
void, void> wy''tqg6  
{ ` K w7"  
public: N=#4L$@-  
explicit bit_iterator(Container& c) : m_container(&c) Id %_{),HX  
{ }&1Iyb  
m_size = 8*sizeof(Container); z!:'V]  
m_index = 0; y?>#t^  
} 27>a#vCT  
explicit bit_iterator() : m_container(0) co/7lsW  
{ =N_,l'U\^  
m_size = 8*sizeof(Container); 9RxO7K  
m_index = m_size; *xcP`  
} ;W0]66&  
bool operator* () +vz` go  
{ H>?F8R_iq  
char mask = 1; _S"f_W  
char* pc = (char*)m_container; 71O3O7  
int i   = (m_size-m_index-1)/8; l)Zs-V!M^\  
int off   = (m_size-m_index-1)%8; NY@"&p'Q  
mask <<=off; {]^2R>0Q  
return pc & mask; `@|w>8bMz{  
} #XI"@pD  
bit_iterator<Container>& operator++() >Rt9xP  
{ g]|_ `  
m_index++; )Pli})   
return *this; M-Y0xWs  
} &8sV o@Pa  
bit_iterator<Container>& operator++(int) 5[4Z=RP  
{ XrS\+y3  
m_index++; L,~MicgV  
return *this; o 7G> y#Y  
} f jI#-  
bool operator==(bit_iterator<Container>& bitIt) cOkgoL" 4  
{ H?uukmZl  
return m_index == bitIt.m_index; !%xP}{(7  
} '"'Btxz  
bool operator!=(bit_iterator<Container>& bitIt) G;TsMq  
{ $}R$t-  
return !(*this == bitIt); YsP/p-  
} !8*McO I  
protected: Q2/.6O8  
Container* m_container; ~F w<eY  
private: ]TSg!H  
int m_size; $b>}C= gt  
int m_index; HM&1y ubh#  
}; MdC<4^|  
xQu eE{  
用该迭代器可以将任意类型对象以二进制格式输出: /APcL5:=  
double a = 10; wGJjA=C  
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

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