以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 "J{zfWr
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 DZ.trtK
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 k&s7-yY
象当作char数组来处理。 7~nCK
template<class Container> A_~5|
class bit_iterator : public std::iterator<bidirectional_iterator_tag, -$t,}3
void, void> 1<`7MN
{ CZRo{2!?U
public: a3O_#l-Z
explicit bit_iterator(Container& c) : m_container(&c) f94jMzH9z
{ HbfB[%
m_size = 8*sizeof(Container); 'a^tL[rLP1
m_index = 0; yKEFne8^
} eI rmD
explicit bit_iterator() : m_container(0) =L),V~b
{ |;m`874
m_size = 8*sizeof(Container); YQdX>k
m_index = m_size; WAXts]=
} CN~NyJL H
bool operator* () PFy;qk
{ 65#:2,s
char mask = 1; ?VP!1O=J
char* pc = (char*)m_container; /
&D$kxz
int i = (m_size-m_index-1)/8; g^ $11
int off = (m_size-m_index-1)%8; 33'lZubV
mask <<=off; D#Yx,`Ui
return pc & mask; Ij}F<ZgZG
} (e3Gs+;
bit_iterator<Container>& operator++() TT ZxkK
{ F*JvpI[7n
m_index++; (2bZ]
return *this; !aw#',r8m
} N^(lUba
bit_iterator<Container>& operator++(int) l()MYuLNV
{ 2, "q_d'V
m_index++; ,,gLrVk
return *this; N46$EsO!h
} vd7N&c9
bool operator==(bit_iterator<Container>& bitIt) 0$L0fhw.
{ !_-sTZ
return m_index == bitIt.m_index; 795Jwv
} .A7tq
bool operator!=(bit_iterator<Container>& bitIt) R 4$Q3vcH
{ Sja{$zL+W
return !(*this == bitIt); WCmNibj
} m_!vIUOz
protected:
-N7L#a
Container* m_container; 3R%UPT0>
private: "G9'm
int m_size; ) Zb`~w
int m_index; `o8{qU,*]N
}; =6Sj}/
Wd`
QpW
用该迭代器可以将任意类型对象以二进制格式输出: CnSX
double a = 10; Xvj=*wg\Y
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));