以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 - _~\d+>w
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 _88X-~.
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 zDBm^ s
象当作char数组来处理。 nchpD@'t
template<class Container> wb%4f6i
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Ce~Pms]
void, void> V+zn`
\a
{ Tkn8Wj
public: _;R#B`9Iu
explicit bit_iterator(Container& c) : m_container(&c) TrNh,5+b
{ Q3'P<"u
m_size = 8*sizeof(Container); q;#bFPh
m_index = 0; -v:3#9uX)
} ,kUg"\_k
explicit bit_iterator() : m_container(0) 3[@:I^q
{ 2Sk hBb=d
m_size = 8*sizeof(Container); |"[;0)dw^
m_index = m_size; #=72/[
} cYvt!M\ed
bool operator* () i6S["\h>
{ 1d$wP$
char mask = 1; W)^%/lAh
char* pc = (char*)m_container; %0({MU
int i = (m_size-m_index-1)/8; q,OCA\
int off = (m_size-m_index-1)%8; *,)1Dcv(
mask <<=off; {{)pb>E
return pc & mask; &XW~l>!+
} 5=fS^]- F
bit_iterator<Container>& operator++() WR u/7$8
{ D&=+PAX
m_index++; X5(oL
return *this; JEK_W<BD
} <<V"4 C2
bit_iterator<Container>& operator++(int) '3~m},0
{ O|+$9#,
m_index++; e(FT4KD~
return *this; Ur ol)_3X
} \=$G94%
bool operator==(bit_iterator<Container>& bitIt) aiZZz1C
{ 7V5kYYR^F
return m_index == bitIt.m_index; ,Y16m{<eC
} \tA@A
bool operator!=(bit_iterator<Container>& bitIt) 4hYK$!"r
{ o}D
}Q"=A
return !(*this == bitIt); 4;(W0RQa
} X5-[v(/]
protected: 9?^0pR p
Container* m_container; ]AZCf`7/?
private: 6G(K8Q{>
int m_size; .yHK
int m_index; FbH@qHSH
}; ;kZJnN"y
Q(R-8"
用该迭代器可以将任意类型对象以二进制格式输出: ?X\uzu
double a = 10; m|;gl|dTB
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));