以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 6~q"#94
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ia/_61%
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 oI%.oP}G
象当作char数组来处理。 C/pu]%n@4
template<class Container> Jz\'%O'
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 93#wU})
void, void> OAz-w
{ mdHC{sp
public: }L*cP;m#
explicit bit_iterator(Container& c) : m_container(&c) ,cFp5tV$
{ SYTzJK@vZJ
m_size = 8*sizeof(Container); .](s\6'
m_index = 0; gG=E2+=uy
} 'GcZxF0
explicit bit_iterator() : m_container(0) uw@|Y{(K r
{ *,DBRJ_*7
m_size = 8*sizeof(Container); b%,`;hy{
m_index = m_size; W1J7$
} o,RLaS,BK'
bool operator* () c8jq.y v
{ n_*k
e
char mask = 1; x_5H_! \#
char* pc = (char*)m_container; ZK]C!8\2|
int i = (m_size-m_index-1)/8; I2'UC)
0
int off = (m_size-m_index-1)%8; 8~|PZ,oZ
mask <<=off; r
yO\$m
return pc & mask; 4<&`\<jZ
} _\LAWQ|M4[
bit_iterator<Container>& operator++() 5q?ZuAAA
{ <[7.+{qfW
m_index++; wy$9QN
return *this; f z8eL:i:
}
.gWYKZM
bit_iterator<Container>& operator++(int) 6F3#Rxh
{ &a
p{|>3
m_index++; x*[\$E`v
return *this; JQ8wL _C>
} ?c^0%Op
bool operator==(bit_iterator<Container>& bitIt) FXOA1VEg
{ GKwm %A
return m_index == bitIt.m_index; 7PZ0
} \qqt/
bool operator!=(bit_iterator<Container>& bitIt) 1G+42>?<1
{ q8.K-"f(Q
return !(*this == bitIt); Uok?FEN
} ^60BQ{ne
protected: \0m[Ch}~ey
Container* m_container; ^l6q
private: _{6QvD3kg.
int m_size; T'l >$6
int m_index; Qe=!'u.nL
}; Sf)VQ5U!Y
nJ4i[j8
用该迭代器可以将任意类型对象以二进制格式输出: b$+.}&M
double a = 10; : \w\K:
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));