以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 a/\{NHs6"5
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 RYA@{.O
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 BGBHA"5fz
象当作char数组来处理。 mM72>1~L*
template<class Container> PWyf3
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ~x!up9
void, void> A$r$g\5+
{ qxb]UV,R
public: oWL_Hh%-f`
explicit bit_iterator(Container& c) : m_container(&c) u1L^INo/
{ }rI:pp^KS
m_size = 8*sizeof(Container); p09p/
m_index = 0; 'Gqv`rq&
} ;RJ
8h
x
explicit bit_iterator() : m_container(0) ?*yyne
{ n
Syq}Y3
m_size = 8*sizeof(Container); {@vnKyf^K
m_index = m_size; ,bXZ<RY$
} C= V2Y_j
bool operator* () 1Vdi5;dn
{ F'b%D
char mask = 1; ,#UZp\zZ*
char* pc = (char*)m_container; Jr( =Y@Z'
int i = (m_size-m_index-1)/8; 4[@YF@_=M
int off = (m_size-m_index-1)%8; t|eH'"N%o
mask <<=off; EC;>-s
return pc & mask; Cp(2]Eb
} Nw'03Jzx_
bit_iterator<Container>& operator++() '"fJA/O
{ q6)fP4MQ]
m_index++; kFwFPK%B
return *this;
_%-
+"3Ll
} !CWe1Dm
bit_iterator<Container>& operator++(int) 5K ;E*s,
{ +ZM,E8
m_index++; I7oA7@zv
return *this; ?}Z t&(#
} #M16qOEw
bool operator==(bit_iterator<Container>& bitIt) X8Q'*
{ LXK!4(xa W
return m_index == bitIt.m_index; 8 s$6R|ti
} |g)C `k
bool operator!=(bit_iterator<Container>& bitIt) d(o=)!p
{ A}SGw.3
return !(*this == bitIt); 0o=HOCL\
} ^"X.aksA
protected: U_(>eVi7F
Container* m_container; qU7_%Z
private: iCF},W+
int m_size; Y@0'0
int m_index; ^~;ia7V&2
}; %`yfi+e
)"pvF8JR%3
用该迭代器可以将任意类型对象以二进制格式输出: R~4X?@ZB
double a = 10; Q!;syJBb.
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));