以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 [i9.#*
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ']x`d
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 &F8N$H
象当作char数组来处理。 bh[`uRC}
template<class Container> bzl-|+!yB
class bit_iterator : public std::iterator<bidirectional_iterator_tag, z;VAi=m
q
void, void> <{z*6FM!'
{ AjW5H*
public: y<h~jz#hkq
explicit bit_iterator(Container& c) : m_container(&c) hHu?%f*
{ }#b[@3/T
m_size = 8*sizeof(Container); oB$P6
m_index = 0; 4@Q`8N.
} ! U6 x_
explicit bit_iterator() : m_container(0) Xcy Xju#"p
{ c=^A3[AM
m_size = 8*sizeof(Container); wa)E.(x
m_index = m_size; [!<W{ ($5
} M9t`w-@_w
bool operator* () ::lD7@Wg
{ +(pFU\&U3H
char mask = 1; A#&,S4Wi|
char* pc = (char*)m_container; h&k*i
int i = (m_size-m_index-1)/8; IwTAM9n
int off = (m_size-m_index-1)%8; " iz'x-wy
mask <<=off; k)a3j{{
return pc & mask; vg.K-"yQW
} mZ[tB/
bit_iterator<Container>& operator++() 0tFR.
sS?
{ jQV.U~25Q
m_index++; 5LkpfmR
return *this; cl'#nLPz;
} k;fy8
bit_iterator<Container>& operator++(int) ~+HZQv3Y
{ 5C G
,l
m_index++; ; xz}]@]Ar
return *this; O1
KT
} Z
ZMz0^V
bool operator==(bit_iterator<Container>& bitIt) I?z*.yA*
{ GY3g`M
return m_index == bitIt.m_index; ZQVr]/W^r
} o)M=; !
bool operator!=(bit_iterator<Container>& bitIt) /`2t$71)
{ |)4aIa
return !(*this == bitIt); TA~FP#.
} .*x |TPv{
protected: (Cc!Iw'0M
Container* m_container; d4 r@Gx%BE
private: nXg:lCI-uu
int m_size; @ uF$m/g
int m_index; x+%(z8wD
}; _[kZ:#
x=7qC#+)
用该迭代器可以将任意类型对象以二进制格式输出: Wpdn^=dhL
double a = 10; p
bT sn
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));