以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 P `oR-D
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 $`5DGy ?RU
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 _E"[%
象当作char数组来处理。 ?Z!KV=
template<class Container> I3L1|!
class bit_iterator : public std::iterator<bidirectional_iterator_tag, x[?_F
void, void> wXZ-%,R-D
{ ::5-UxGL<2
public: P#0_
explicit bit_iterator(Container& c) : m_container(&c) FE5R
^W#u-
{ y%GV9
m_size = 8*sizeof(Container); MUo?ajbqOd
m_index = 0; D{4
Y:O&J
} e-s@@k
explicit bit_iterator() : m_container(0) Vnl~AQfk|
{ \vT8
)\
m_size = 8*sizeof(Container); ^ID%pd
m_index = m_size; m:^@AR1%d
}
Kr#=u~~M
bool operator* () %sq=lW5R{b
{ _<~05Eh
char mask = 1; '0=U+Egp
char* pc = (char*)m_container; 4 '+)9&g
int i = (m_size-m_index-1)/8; ~W#f,mf
int off = (m_size-m_index-1)%8; $K iMu
mask <<=off; kQb0pfYs
return pc & mask; QxkfP %_g
} :C&?(HJ&r
bit_iterator<Container>& operator++() af_zZf!0
{ _m&VdIPO
m_index++; zZRqb/20
return *this; j[HKC0C6
} 42C:cl} ."
bit_iterator<Container>& operator++(int) ZD<,h`
lZ
{ *dQRs6
m_index++; J\%:jg( m
return *this; 0N}5sF
} u,pm\
bool operator==(bit_iterator<Container>& bitIt) @Yg7F>s
{ kj8zWG4KH
return m_index == bitIt.m_index; `SG70/
} g PfaiVY
bool operator!=(bit_iterator<Container>& bitIt) <V,?!}V
{ l&rDa=m.J
return !(*this == bitIt); [0}471
} :X!(^a;]
protected: b^xf,`D
Container* m_container; :@/fy}!
private: pqs)ueu
int m_size; }/LYI
int m_index; I*ej_cFQ^
}; _c&*'IY[V
YOY+z\Q
用该迭代器可以将任意类型对象以二进制格式输出: Q(sbClp"
double a = 10; X1-s,[j'
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));