以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 6&
(b L<8b
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 R 7h^
@
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 %lk^(@+ T
象当作char数组来处理。 R$ra=sL`
template<class Container> kzk8b?rOA
class bit_iterator : public std::iterator<bidirectional_iterator_tag, nR]*RIp5
void, void> 4^Ss\$*
{ Z;O!KsJ
public: ^Gi7th,
explicit bit_iterator(Container& c) : m_container(&c) KpBOmXE
{ 7qSnP30}
m_size = 8*sizeof(Container); h#p[6}D
m_index = 0; G|oO
} 2qdc$I&$
explicit bit_iterator() : m_container(0) &S=Qu?H
{ cQkj{u
m_size = 8*sizeof(Container);
Y\Z6u)
m_index = m_size; w@"Zjbs`
} kQ]4Bo
bool operator* () v#lrF\G5
{ M"Af_Pbx
char mask = 1; /lC,5y
char* pc = (char*)m_container; ch2m Ei(
int i = (m_size-m_index-1)/8; Jkv!]C
int off = (m_size-m_index-1)%8; Kton$%Li
mask <<=off; &q&~&j'[
return pc & mask; u/<ZGW(&s(
} ;m7~!m)
bit_iterator<Container>& operator++() Vm?# ~}T
{ r$v\ \^?2
m_index++; g(auB/0s
return *this; %"cOX
} Oq$-*N
bit_iterator<Container>& operator++(int) YZ]}l%e
{ |"PS e~ u
m_index++; H<}|n1w<
return *this; k`o8(zPb
} TMD\=8Na
bool operator==(bit_iterator<Container>& bitIt) WJxcJE
{ nrA 4N1
return m_index == bitIt.m_index; |)v}\-\#
} E,F^!4 rJ$
bool operator!=(bit_iterator<Container>& bitIt) CDF;cM"td
{ bo/<3gR
return !(*this == bitIt); 5VpqDL~d
} wpp!H<')
protected: ,cxe"U
Container* m_container; 3-E-\5I
private: VFM!K$_
int m_size; [NJ2rQ/w7
int m_index; !VaC=I^{
}; t^Lb}A#$4
W}N7jPO}
用该迭代器可以将任意类型对象以二进制格式输出: w#hg_RK(Jr
double a = 10; m,"-/)
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));