以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 nYgx9Q"<om
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %N1T{
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 LNbx3W
oC
象当作char数组来处理。 y,1S&k
template<class Container> l [x%I
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ew/KZE
void, void> iF+S%aPd#
{ LP8o7%sv!
public: AV9:O{
explicit bit_iterator(Container& c) : m_container(&c) bL#sn_(m
{ ,&4zKm
m_size = 8*sizeof(Container); e$x4Ux7*"
m_index = 0; bQ
i<0|S
} Y9/{0TArG
explicit bit_iterator() : m_container(0) X #H:&*[!
{ S54gqc1S]
m_size = 8*sizeof(Container); pEJ#ad
m_index = m_size; /1H9z`qV
} <)=3XEcb
bool operator* () )|MIWgfWN
{ Cd$dnHVh
char mask = 1; .$n$%|"H-
char* pc = (char*)m_container; oPp!*$V
int i = (m_size-m_index-1)/8; |2[S/8g!
int off = (m_size-m_index-1)%8; b"`ru~]
mask <<=off; {c&qB`y<.
return pc & mask; .Gjr`6R
} J~M H_N
bit_iterator<Container>& operator++() cA2^5'$$
{ Ompi~
m_index++; M9g~lKs'
return *this; t$ACQ*O
} N`y}Gs
bit_iterator<Container>& operator++(int) Fc34Y0_A
{ 'Wo?%n
m_index++; Mb2:'u[
return *this; ]J8KCjq@
} OHx,*}N
bool operator==(bit_iterator<Container>& bitIt) Dlqn~
{ OL,/-;z6
return m_index == bitIt.m_index; V)_H E
} wrZ7Sr!/V
bool operator!=(bit_iterator<Container>& bitIt) #i}# jMT
{
'7S!6kd?
return !(*this == bitIt); _"R3N
} e;&{50VY
protected: GoGohsj
Container* m_container; R=#q"9qz
private: l(3'Re
int m_size; "ZA$"^
int m_index; CF4Oh-f
}; "z{_hp{T^
X+?Il)Bv
用该迭代器可以将任意类型对象以二进制格式输出: Z`SWZ<
double a = 10; ;PP_3`
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));