以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 <A{|=2<
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 YbaaX{7^
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 V<X[>C'
象当作char数组来处理。 ;pk4Voo$
template<class Container> 8<BYAHY^
class bit_iterator : public std::iterator<bidirectional_iterator_tag, #-76E
void, void> vW`Dy8`06
{ "B18|#v
public: Leg)q7n
explicit bit_iterator(Container& c) : m_container(&c) >uVo'S.
{ ~s.~X5
m_size = 8*sizeof(Container); Yj%hgb:)
m_index = 0; DK' ? '
} ?:@13wm
explicit bit_iterator() : m_container(0) |wF_CZ*1
{ P2HR4`c
m_size = 8*sizeof(Container); 5u/d r9n
m_index = m_size; R]{zGFnx
} \o-9~C\c*
bool operator* () r\#_b4-v3h
{ ZJL8"(/R
char mask = 1; _v~c3y).
char* pc = (char*)m_container; +ucj>g1(#
int i = (m_size-m_index-1)/8; G- _h 2
int off = (m_size-m_index-1)%8; #G</RYM~m
mask <<=off; xBba&A]=
return pc & mask; [k1N-';;;
} h"~i&T
h
bit_iterator<Container>& operator++() m9yi:zT%
{ ?'RB)M=Og7
m_index++; E?\&OeAkO
return *this; n7Em
t$Hi>
} GnAG'.t-Z
bit_iterator<Container>& operator++(int) rGa@!^hk
{ Ck`-<)uN
m_index++; E}^np[u7
return *this; w ;;yw3
} <x&0a$I
bool operator==(bit_iterator<Container>& bitIt) ie<zc+*rW
{ tX'`4!{@+
return m_index == bitIt.m_index; a1^CpeG~
} h%4aL38
bool operator!=(bit_iterator<Container>& bitIt) \!O3]k,r
{ UA>3,|gV1
return !(*this == bitIt); i}&&rr
} P{T\zT
protected: }kJfTsFS
Container* m_container; gMXs&`7P
private: _*&I[%I5
int m_size; &,v-AL$:Q
int m_index; E6 g]EE
}; o!6~tO=%
j-~x==c-;
用该迭代器可以将任意类型对象以二进制格式输出: %}.4c8
double a = 10; Iax-~{B3AY
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));