以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 `t)9u^[<(
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 m26YAcip}
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 +> !nqp
象当作char数组来处理。 \$Wpt#V
template<class Container> '=Lpch2J
class bit_iterator : public std::iterator<bidirectional_iterator_tag, *kqC^2t
void, void> 'xkl|P>=],
{ 7f ub^'_
public: =IQ}Y_xr
explicit bit_iterator(Container& c) : m_container(&c) =dKjTBR S'
{ { ,c*OR
m_size = 8*sizeof(Container); kVKAG\F
m_index = 0; _]4p51r0
} *DfOm`m
explicit bit_iterator() : m_container(0) dr=Q9%
{ >&S}u\/
m_size = 8*sizeof(Container); 76<mP*5
m_index = m_size; y||RK`H
} T~Bj],k_
bool operator* () u4SL:IH{D
{ EUcD[Rv
char mask = 1; {b4`\I@<
char* pc = (char*)m_container; wDW%v@
int i = (m_size-m_index-1)/8; *w*>\ZhOm
int off = (m_size-m_index-1)%8; -XCs?@8EQ
mask <<=off; [yQ%g;m
return pc & mask; 9.M'FCd~M
} o#f"wQH;p
bit_iterator<Container>& operator++() pUqC88*j
{ 3s%ND7!/
m_index++; OQ?N_zs,
return *this; &5b3k[K"
} msfE;
bit_iterator<Container>& operator++(int) J({D~
{
0]c&K
m_index++; /R=MX>JA;
return *this; r W[;3yMf
} eeCG#NFY5
bool operator==(bit_iterator<Container>& bitIt) mi Q*enZi
{ =NC??e {
return m_index == bitIt.m_index; o|z@h][(l(
} ={oNY.(Q
bool operator!=(bit_iterator<Container>& bitIt) J$1H3#VVG
{ \b(&-=(
return !(*this == bitIt); Ta?}n^V?;
} N2A6C$s
protected: '0q$qN
Container* m_container; ;; +AdN5
private: Nv36#^Z
int m_size;
iD_y@+iz
int m_index; KU` *LB:
}; T&]-p:mg^
|JYb4J4Ni
用该迭代器可以将任意类型对象以二进制格式输出: QWfSm^
t
double a = 10; {P~rf&Ee
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));