以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 p9;Oe,Il
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Tl^9!>\Q
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 E|t.
3
象当作char数组来处理。 5U&b")3IT!
template<class Container> oh
k.;
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !1tHg Z2\
void, void> kCXQHX
{ :1q)l
public: s4@dEK8W
explicit bit_iterator(Container& c) : m_container(&c) &@O]'
{ [X'XxYbZ
m_size = 8*sizeof(Container); qn VxP&
m_index = 0; (j^Qa~{mG4
} 4aAuE0
explicit bit_iterator() : m_container(0) d`he
Wv^/`
{ 2NHkK_B1P
m_size = 8*sizeof(Container); M^c`j#NQ
m_index = m_size; o5 UM)g
} +>#SB"'
bool operator* () v=A]#O%
{ zI5#'<n
char mask = 1; Zl69d4vG
char* pc = (char*)m_container; ?MT
V!i0
int i = (m_size-m_index-1)/8; O,`#h*{N
int off = (m_size-m_index-1)%8; 9E/{HNkf
mask <<=off; 2D;,'
return pc & mask; w-%V9]J1
} $4^cbk
bit_iterator<Container>& operator++() <9JI@\>
{ iGxlB
m_index++; "@1e0`n
Q
return *this; P|>
f O'
} B{UL(6\B
bit_iterator<Container>& operator++(int) sb Wn1 T
U
{ DQ'=$z
m_index++; '->%b
return *this; _g|zDi^
} "~R,%sYb(
bool operator==(bit_iterator<Container>& bitIt) f}JiYZ
{ h0}=C_.^
return m_index == bitIt.m_index; F)ak5
} {:U zW\5l)
bool operator!=(bit_iterator<Container>& bitIt) -nVQB146^
{ 6w3z&5DY|
return !(*this == bitIt); k8!|WqfP
} P.L$qe>O
protected: qPEtMvL
#
Container* m_container; .TcsXYL.`,
private: pFfd6P
int m_size; )-D{]>8
int m_index; C`s
}; ;B4x>
ldd|"[Ds
用该迭代器可以将任意类型对象以二进制格式输出: ]ZV.@%+
double a = 10; v6Vie o=
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));