以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 gWGh:.*T
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 B1k;!@@14
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 G6XDPr:}
象当作char数组来处理。 :\"V5
template<class Container> >9+h2B
class bit_iterator : public std::iterator<bidirectional_iterator_tag, K9tr Iy$v
void, void> x>GxyVE
{ |@Ze{\
public: M`49ydh&
explicit bit_iterator(Container& c) : m_container(&c) )1E#'v12"
{ gkFw=Cd
m_size = 8*sizeof(Container); *cy!PF&
m_index = 0; |0nt u+
} MWI7u7{
explicit bit_iterator() : m_container(0) DR(/|?k+
{ X<<FS%:+
m_size = 8*sizeof(Container); @ruWnwb
m_index = m_size; nC5]IYL|
} HXb_k1n
bool operator* () #:xv]qb`k
{ hH~GH'dnaE
char mask = 1; YZZog 6%
char* pc = (char*)m_container; 71c(Nw~iQ
int i = (m_size-m_index-1)/8; xs^wRE_
int off = (m_size-m_index-1)%8; Y(;u)uN_
mask <<=off; Hn}m}A
return pc & mask; sf Zb$T
J
} ziXI$B4-
bit_iterator<Container>& operator++() ay,"MJ2
{ W.^R/s8O%5
m_index++; ddwokXx
(
return *this; 9cQ;h37J>
} ]VoJ7LoCZ'
bit_iterator<Container>& operator++(int) fS]Z`U"
{ VK%
j45D `
m_index++; ttY[\D&ZS
return *this; xm0(U0
>
} `B/74Wa3q
bool operator==(bit_iterator<Container>& bitIt) Bej k^V~
{ e3WEsD+
return m_index == bitIt.m_index; fF^A9{{BS
} 3/Dis)
v8
bool operator!=(bit_iterator<Container>& bitIt) y]}N[l
{ a,eEP43dn
return !(*this == bitIt); rih@(;)1
} yL_\&v
protected: BeFXC5-qat
Container* m_container; ) ):w`^6
private: ]RxWypA`
int m_size; `8kL=%(h
int m_index; >AW&Lfw$
}; XnB-1{a1
>M7(<V
用该迭代器可以将任意类型对象以二进制格式输出: ~H:.&'E
double a = 10; s1J(-O
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));