以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {2,vxGi
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 p;0p!~F=49
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 tkjQSz
象当作char数组来处理。 H.=S08c3kA
template<class Container> g*]/HS>e<G
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 6)j4-
void, void> {@YY8SKb9
{ |f IIfYE
public: m(DJ6CSa
explicit bit_iterator(Container& c) : m_container(&c) B3C%**~:e
{ YkuFt>U9,
m_size = 8*sizeof(Container); rU!QXg]uD
m_index = 0; L5j%4BlK/
} p()#+Xy
explicit bit_iterator() : m_container(0) lC8Z@wkjO
{ 2>+(OL4l
m_size = 8*sizeof(Container); ]9]o*{_+(f
m_index = m_size; oo4aw1d
} dgp1 B\
bool operator* () 3[F9qDAy
{ Vl\8*!OL%
char mask = 1; M%(^GdI#Vf
char* pc = (char*)m_container; Z`]r)z%f
int i = (m_size-m_index-1)/8; ms%RNxU4:
int off = (m_size-m_index-1)%8; hteAuz4H
mask <<=off; UYw=i4J'
return pc & mask; <reALC
} 0Fc^c[
bit_iterator<Container>& operator++() 3LW_qX
{ 0aM&+j\q}
m_index++; ^Iy'G44
return *this; ATzFs]~K;
} dn1Fwy.
bit_iterator<Container>& operator++(int) !%X#;{
{ :tf'Gw6v
m_index++; \@!"7._=
return *this; L'L[Vpx
} "zZZ h
bool operator==(bit_iterator<Container>& bitIt) uEui{_2$
{ {$xt.<
return m_index == bitIt.m_index; NXHe;G
} u8Ak2:
bool operator!=(bit_iterator<Container>& bitIt) \`U=pZJ
{ s~'"&0Gz
return !(*this == bitIt); 6"YcM:5~
} pt$\pQ
protected: nr]:Y3KyxX
Container* m_container; sOqT*gwr:
private: (|9t+KP
int m_size; G$mAyK:
int m_index; 9_-6Lwj6t
}; 5_7y 1
Aw$+Ew[8 2
用该迭代器可以将任意类型对象以二进制格式输出: iu.v8I;<
double a = 10; LE}V{%)xD
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));