以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 2#l<L>#
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 \|nF55W [
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 y0>asl
象当作char数组来处理。 'M185wDdAl
template<class Container> 7PO3{I
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Rkm1fYf
void, void> WS8m^~S@\
{ )%x oN<
public: emOd<C1A
explicit bit_iterator(Container& c) : m_container(&c) ^D\1F$AjC
{ xc[@lr
m_size = 8*sizeof(Container); YLVV9(
m_index = 0; ]&\HAmOQS
} 4k_&Q?1
explicit bit_iterator() : m_container(0) zQ9"i
{ Zpg/T K
m_size = 8*sizeof(Container); -_Pd d[M
m_index = m_size; wEENN_w
} gO%#'Eb2
bool operator* () ,ii*[{X?
{ "Wr5:T-;
char mask = 1; c4ptY5R),
char* pc = (char*)m_container; q}>1Rr|U`
int i = (m_size-m_index-1)/8; ?D-1xnxep
int off = (m_size-m_index-1)%8; ,~8:^*0s
mask <<=off; !/+ZKx("9
return pc & mask; i`/_^Fndyu
} q\ FF)H
bit_iterator<Container>& operator++() yjUZ40Dq
{ Ov"]&e(I[
m_index++; PE3FuJGz
return *this; Mg;%];2Nt
} $Z6g/bD`E
bit_iterator<Container>& operator++(int) mZ
39 s
{ % eWzr
m_index++; ia
1Sf3
return *this; !!Z#'Wq
} 4s nL((
bool operator==(bit_iterator<Container>& bitIt) =LV7K8FSd
{ ;EbGW&T
return m_index == bitIt.m_index; 3Yf&F([t
} w2!G"oD
bool operator!=(bit_iterator<Container>& bitIt) n4Nb,)M
{ SLp &_S@4
return !(*this == bitIt); 01N"
} w naP? |/
protected: 0 3fCn"
Container* m_container; exw~SvT3
private: ,gGIkl&
int m_size; &C<K|F!j!
int m_index; cHOtMPyQ
}; MTo<COp($
nmZz`P9g
用该迭代器可以将任意类型对象以二进制格式输出: >(mp$#+w
double a = 10; 3~Od2nk(x
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));