以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 4{uJ||!
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 30:HRF(:
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 k$Nx6?8E
象当作char数组来处理。 `\6 +z
template<class Container> 4ZSfz#<[z
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Hd96[Uo
void, void> B/[hi%~
{ 4d,qXSKty
public: h:eN>yW
explicit bit_iterator(Container& c) : m_container(&c) w`2_6[,9
{ g5?r9e
m_size = 8*sizeof(Container); YeR7*[l
m_index = 0; noWRYS %
} >IR`]
explicit bit_iterator() : m_container(0) pU[a[
{ t>fA!K%{
m_size = 8*sizeof(Container); aA!@;rR<yU
m_index = m_size; 8JFnB(3xU
} w/)e2CH
bool operator* () 2*b#+ b
{ !^rITiy
char mask = 1; gt(X!iN]
char* pc = (char*)m_container; Ss*LgK_
int i = (m_size-m_index-1)/8; R
A-^!4tX
int off = (m_size-m_index-1)%8; ~M|NzK_9
mask <<=off; `K@5_db\
return pc & mask; >c~9wv
} ~{kA) :
bit_iterator<Container>& operator++() Uj
y6vgU;
{ F=P+;%.
m_index++; `Nxo0Q
return *this; Ej9/_0lt
} W\ZV0T;<]
bit_iterator<Container>& operator++(int) fwz5{>ON]
{ D"1vw<Ak
m_index++; j X^&4f
return *this; !c3Qcva
} vgd}09y
bool operator==(bit_iterator<Container>& bitIt) loAfFK>g
{ 6Vu}kK)
return m_index == bitIt.m_index; hv_pb#1Ks
} g%KGF)+H
bool operator!=(bit_iterator<Container>& bitIt) 5G
dY7t_1
{ t\E-6u
return !(*this == bitIt); Iltg0`
} @9
qzn&A
protected: Q7OnhGA
Container* m_container; 6=aBD_2@
private: mUe@Dud
int m_size; o%9Ua9|RR
int m_index; k1@
A'n
}; wjw<@A9
l=<F1L z
用该迭代器可以将任意类型对象以二进制格式输出: R
oF
double a = 10; v{\n^|=])
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));