以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 q35%t61Lc
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 B RD>q4w
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 r$G;^
象当作char数组来处理。 Eu1s
template<class Container> -}PD0Pzg;=
class bit_iterator : public std::iterator<bidirectional_iterator_tag, khc5h^0
void, void> x\I9J4Q
{ h,
+2Mc<
public: mY dU`j
explicit bit_iterator(Container& c) : m_container(&c) pd>EUdbrp&
{ BU]9eF!>h
m_size = 8*sizeof(Container); @*A(#U8p3
m_index = 0; O_(J',++
} 1B,RRHXn6
explicit bit_iterator() : m_container(0) Kd7OnU
{ Ca?pK_Y
m_size = 8*sizeof(Container); AO>K
6{
m_index = m_size; C0KP,JS&
} *kZJ
bool operator* () ikyvst>O
{ AkT_ZU>
char mask = 1; m'z <d
char* pc = (char*)m_container; <bIAq8
int i = (m_size-m_index-1)/8; k.
px
int off = (m_size-m_index-1)%8; Z~muQ c?
mask <<=off; *Fp )/Ih
return pc & mask;
tGv4 S\
} ,i,f1XJ|
bit_iterator<Container>& operator++() aMh2[I
{ 1UxRN7
m_index++; 7&|fD{:4U
return *this; <Pg.N
} @0n #Qs|E!
bit_iterator<Container>& operator++(int) ,f}s!>j
{ fvN2]@:
m_index++; is#?O5:2
return *this; Kax85)9u
} 0#XZ_(@%
bool operator==(bit_iterator<Container>& bitIt) Gq+!%'][P
{ c1jgBty
return m_index == bitIt.m_index; vseuk@>
} #sAEIk/
bool operator!=(bit_iterator<Container>& bitIt)
%|l*=v
{ Wa,[#H
return !(*this == bitIt); _2U1$0xK
} :N%]<Mq
protected: o5. q
Container* m_container; <=^YIp
private: +4B>gS[ F
int m_size; AR/`]"'
int m_index; 6ZCt xs!
}; YI&^j2
tw\/1wa.
用该迭代器可以将任意类型对象以二进制格式输出: olQ;XTa01F
double a = 10; \CU.'|X
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));