以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 @>IjfrjV
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 FBAC9}V"
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 CD1=2
象当作char数组来处理。 _0["J:s9
template<class Container> /A.i5=k
class bit_iterator : public std::iterator<bidirectional_iterator_tag, /&:9VMMj
void, void> .K1E1Z_
{ BDRVT Y(s
public: Vk_&W.~
explicit bit_iterator(Container& c) : m_container(&c) a.IF%hP0xo
{ Y^Q|l%Qrb
m_size = 8*sizeof(Container); ?1:/
6
m_index = 0; SQU%N
} ]~Vu-@
/}
explicit bit_iterator() : m_container(0) #ljg2:I+
{ 9:i,WJO
m_size = 8*sizeof(Container); (y=o]Vy
m_index = m_size; FTnQqDuT
} [0ffOTy
bool operator* () ]C6[`WF
{ idS
RWa
char mask = 1; QeJ.o.m{
char* pc = (char*)m_container; _1> 4Q%
int i = (m_size-m_index-1)/8; }!]x|zU.=
int off = (m_size-m_index-1)%8; yO;C3q
mask <<=off; ENWB|@B
return pc & mask; wV&f|JO0+
} +7<>x-+
bit_iterator<Container>& operator++() <lmJa#
{ So*Wk "
m_index++; @1&;R
return *this; Fg\| e%
} \e8*vos
bit_iterator<Container>& operator++(int) nYy}''l<
{ KbdfSF$
m_index++; *-AAQ
return *this; %
r Y8
} >^f)|0dn)E
bool operator==(bit_iterator<Container>& bitIt) .S'fM]_#
{ ]|t.wr3AU
return m_index == bitIt.m_index; ,e FQ}&^A
} s!/holu
bool operator!=(bit_iterator<Container>& bitIt) FgQ_a/*
{ fk7Cf"[w
return !(*this == bitIt); NZC='3Uz
} N3yB1_
protected: 1|WpKaMoq
Container* m_container; t-m9n*\j1
private: sMS9!{A
int m_size; Wj j2J8B
int m_index; sp
Q4m
}; z2Y_L8u2
"gvw0)
用该迭代器可以将任意类型对象以二进制格式输出: -V
u/TT0
double a = 10; (d'j'U:C
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));