以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Y(=A HmR
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 wK0],,RN,h
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 NRazI_Z
象当作char数组来处理。 .0p'G}1
template<class Container> +*wr=9>
class bit_iterator : public std::iterator<bidirectional_iterator_tag, m]Mm(7v(
void, void> v^B2etiX_
{ ~.CmiG.7
public: 5]K2to)>`
explicit bit_iterator(Container& c) : m_container(&c) O]KQ]zN
{ Z=oGyA
m_size = 8*sizeof(Container); T\"-q4+=C
m_index = 0; (*9-Fa
} w<Bw2c
explicit bit_iterator() : m_container(0) 73JrK_h
{ -t: U4r(
m_size = 8*sizeof(Container); *Tr9pq%m
m_index = m_size; KbMan~Pb6
} gBOF#"-
bool operator* () Zgo%Jo
{ F?t;bV
char mask = 1; HSVl$66
char* pc = (char*)m_container; }i J$&CJ
int i = (m_size-m_index-1)/8; hD{
`j
int off = (m_size-m_index-1)%8; ZEso2|
mask <<=off; ""*g\
return pc & mask; @2;cv?i)
} ,&L}^ Up
bit_iterator<Container>& operator++() O=6[/oc
'
{ zbgGK7
m_index++; <GF^VT|Ce
return *this; _fSBb<
} mF4y0r0
bit_iterator<Container>& operator++(int) [s{[
.0P]+
{
+
)[@
m_index++; @8$z2
return *this; '8[;
m_S
} Hg$7[um
bool operator==(bit_iterator<Container>& bitIt) G #M0
C>n
{ z#1"0Ks&P
return m_index == bitIt.m_index; xsiJI1/68
} `F3wO!
bool operator!=(bit_iterator<Container>& bitIt) LR';cR;
{ 7O:g;UI#
return !(*this == bitIt); 3_`)QYU'
} M93*"jA
protected: \+=`o .2
Container* m_container; $HtGB]
private: XMdCQ=
int m_size; { {:Fs
int m_index; w*&vH/D
}; K/j u=>
zWH)\>X59
用该迭代器可以将任意类型对象以二进制格式输出: K:GEC-
double a = 10; 'GT^araz
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));