以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 y^:N^Gt
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Lj2Au_5
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 l1UN.l'p
象当作char数组来处理。 $N/"c$50,
template<class Container> \f4JIsZ-&
class bit_iterator : public std::iterator<bidirectional_iterator_tag, #-7w|
void, void> \5DOp-2
{ -izZ D
public: ana?;NvC
explicit bit_iterator(Container& c) : m_container(&c) ydMfV-
{ ?#gYu%7DN
m_size = 8*sizeof(Container); }@TtX\7(D
m_index = 0; "JpnmE[`
} <sor;;T
explicit bit_iterator() : m_container(0) wS;hC&~2
{ N
VBWF
m_size = 8*sizeof(Container); T :0#se
m_index = m_size; `VXC*A
} ay>u``$R
bool operator* () Al^h^ 9tJ
{ q~6((pWi|
char mask = 1; eUEO~M2&U{
char* pc = (char*)m_container; VWT\wAL
int i = (m_size-m_index-1)/8; V1 O]L66
int off = (m_size-m_index-1)%8; (aX6jdvo
mask <<=off; u Tvck6
return pc & mask; cIOM}/gqv
} %y[
t+)!E
bit_iterator<Container>& operator++() dS)c~:&+
{ IgNL1KRD
m_index++; 2>'/!/+R
return *this; CAtdx!
} IiB"F<&[j{
bit_iterator<Container>& operator++(int) %dDwus
{ $zD}hO9
m_index++; o 4cqLMu
return *this; o}6d[G>
} ,+o*>fD
bool operator==(bit_iterator<Container>& bitIt) 5o2|QL
{ a9niXy}a(
return m_index == bitIt.m_index; hM~zO1XW
} We:b1sZR
bool operator!=(bit_iterator<Container>& bitIt) #n6<jF1G
{ s* UO!bH a
return !(*this == bitIt); 3}V-'!
} MtXTh*4
protected: xAJuIR1Hi
Container* m_container; <p\iB'y
private: HWxwG'EEY,
int m_size; sFa5#w*>
int m_index; Ika(ip#]=
}; Fpckb18}(O
C
]+J
用该迭代器可以将任意类型对象以二进制格式输出: @ !m+s~~]h
double a = 10; m+'vrxTY
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));