以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 p<M\U"5Ye
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 u\eEh*<7q
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 5mb]Q)f9-
象当作char数组来处理。 |4'Y/re
template<class Container> y+7w,m2
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ~NW32
O)/
void, void> \7CGUB>L
{ ai0XL}!+
public: &x3VCsC\|
explicit bit_iterator(Container& c) : m_container(&c) w^t/9Nasi
{ / X1 x
m_size = 8*sizeof(Container); _a1x\,R|DB
m_index = 0; )"pF R4
} uu`G 2[t
explicit bit_iterator() : m_container(0) S~|T4q(
{ @')[FEdW
m_size = 8*sizeof(Container); K4kMM*D
m_index = m_size; ,G)r=$XU
} o"*AtGR+"
bool operator* () 812$`5l
{ t. ;LnrY
char mask = 1; G;YrF)\
char* pc = (char*)m_container; <>Hj
;q5p
int i = (m_size-m_index-1)/8; x&0vKo;
int off = (m_size-m_index-1)%8; Cg(Y&Gxf.
mask <<=off; X7rMeu
return pc & mask; >p"c>V& 8
} U*)8G
bit_iterator<Container>& operator++() <u2 }i<#
{ NU0g07"
m_index++; *c2YRbU(
return *this; <~WsD)=$
} soQ1X@"0
bit_iterator<Container>& operator++(int) >rf'-X4n
{ t2)rUWg
m_index++; ^jx7@LgS=
return *this; P?k0zwOlBl
} O&Y*pOg
bool operator==(bit_iterator<Container>& bitIt) pej|!oX
{ ')$+G152
return m_index == bitIt.m_index; V;v8=1t!
} ml+; Rmvb
bool operator!=(bit_iterator<Container>& bitIt) #)nSr
{ aeD ;5VV
return !(*this == bitIt); s=;uc]9g
} u?}(P_9
protected: n^g|Ja
Container* m_container; (=om,g}
private: _WRFsDZ'
int m_size; 3eF-8Z(f
int m_index; r [*Vqcz
}; <_-hRbS
jEZMUqGY!
用该迭代器可以将任意类型对象以二进制格式输出: Rd#WMo2Xd
double a = 10; Eqj_m|@
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));