以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 #Jx6DQGa
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 c\P,ct
}>
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 D5Z@6RVt
象当作char数组来处理。 ,1|Qm8O
template<class Container> ICvl;Q
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !!KA9mP
void, void> 8D]&wBR:
{ 9-B/n0
public: e^ Aw%t
explicit bit_iterator(Container& c) : m_container(&c) FqWW[Bgd
{ Jam&Rj,
m_size = 8*sizeof(Container); ^Kbq.4
m_index = 0; GMv.G
} #aHJ|[[(n
explicit bit_iterator() : m_container(0) r(qwzUI
{ }F
B]LLi
m_size = 8*sizeof(Container); VoG_'P
m_index = m_size; OTy{:ID
} ":I@>t{H*
bool operator* () R(t1Ei.-?
{ $c1zMkY)u
char mask = 1; 2%{(BT6
char* pc = (char*)m_container; FN+x<VXo(
int i = (m_size-m_index-1)/8; xU6rZCqE
int off = (m_size-m_index-1)%8; +sY8<y@%
mask <<=off; 6P$jMjs
return pc & mask; uUIjntSF(
} 1#w'<}h#U
bit_iterator<Container>& operator++() k00&+C
{ E[=#Rw!*
m_index++; YqQAogyh
return *this; O)FkpZc@9c
} evQk,;pIm
bit_iterator<Container>& operator++(int) =JW.1;
{ E*"-U!?)l2
m_index++; cVYPPal
return *this; }+/F?_I=
%
} J/k4CV*li(
bool operator==(bit_iterator<Container>& bitIt) '=V1'I*
{ S%6 V(L|
return m_index == bitIt.m_index; eaWK2%v
} Z@ dS,M*
bool operator!=(bit_iterator<Container>& bitIt) hY(q@_s
{ #qcF2&a%
return !(*this == bitIt); c,,(s{1
} -s_=4U,
protected: zcE`.)y
Container* m_container; p|`[8uY?
private: K%@#a}kRb
int m_size; Ib}~Q@?2
int m_index; IM(=j
}; D:56>%y@
_(_U=
用该迭代器可以将任意类型对象以二进制格式输出: Q2LAXTF]y
double a = 10; xXQW|#X\
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));