以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 B=n90XO |
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 O%>*=h`P
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 xFThs,w
象当作char数组来处理。 i ?M-~EKu
template<class Container> 9)S3{i6w
class bit_iterator : public std::iterator<bidirectional_iterator_tag, x"C7NW[$
void, void> d`flYNg4
{ $G)HU6hF*
public:
~XWBLU<
explicit bit_iterator(Container& c) : m_container(&c) S _U |w9q
{ M6Xzyt|
m_size = 8*sizeof(Container); F7b%
x7b
m_index = 0; $,/E"G`
} -R]~kGa6m<
explicit bit_iterator() : m_container(0) z^tzP~nI
{ 0nD?X+ u
m_size = 8*sizeof(Container); U*yOe*>
m_index = m_size; <Rn-B).3bs
} pi#a!Quf\
bool operator* () =$y J66e
{ (=WYi~2v
char mask = 1; DQ/rx`BG
char* pc = (char*)m_container; 9__Q-J
int i = (m_size-m_index-1)/8; *}#HBZe(9
int off = (m_size-m_index-1)%8; V?.=_T<
mask <<=off; acUyz2x
return pc & mask; Wvu1?
} 4B[pQlg
bit_iterator<Container>& operator++() "0 %fR"
{ OMo /a%`
m_index++; tg 'g R
return *this; os;94yd)
} _!,2"dS
bit_iterator<Container>& operator++(int) [Rq|;p
{ %WR"qd&HSh
m_index++; ,/V~T<FI
return *this; ]:2Ro:4Yv
} 9$9aBW
bool operator==(bit_iterator<Container>& bitIt) [hH>BEtm
{ 2g5 4<G*e
return m_index == bitIt.m_index; yk4py0xVl
} <v_Wh@m
bool operator!=(bit_iterator<Container>& bitIt) reYIF*
{ <Pe'&u
return !(*this == bitIt); k^;/@:
} d^tY?*n
protected: e&ZH 1^O
Container* m_container; RZq_}-P,.c
private: ABp8PD
int m_size; jG& 8`*|*
int m_index; Jc5YGj 7
}; D_ej%QtB@
1\/vS$bi(
用该迭代器可以将任意类型对象以二进制格式输出: r+#g
double a = 10; -%>Tjo@Bn
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));