以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 $Wj{B@k
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 &V$cwB
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 WZn;u3,R
象当作char数组来处理。 ;Ivv4u
template<class Container> %(p9AE
class bit_iterator : public std::iterator<bidirectional_iterator_tag, `ovMfL.u
void, void> KJ32L
{ Q"D
public: j0~am,yZ
explicit bit_iterator(Container& c) : m_container(&c) jT$J~MpHh
{ 6xtgnl#T
m_size = 8*sizeof(Container); uA[
:
m_index = 0; TP {\V>*Yz
} CEkUXsp
explicit bit_iterator() : m_container(0) bRyxP2
{ ym%` l!
m_size = 8*sizeof(Container); 1E
/G+pm
m_index = m_size; qpjZ-[UC
} Um\HX6
bool operator* () .=Oww
{ A03io8D6
char mask = 1; GvG8s6IZ
char* pc = (char*)m_container; L~{(9J'(
int i = (m_size-m_index-1)/8; MXfyj5K
int off = (m_size-m_index-1)%8; @(35I
mask <<=off; r>ed/<_>m;
return pc & mask; keRLai7h
} 0C%IdV%CU
bit_iterator<Container>& operator++() lSaX!${R'T
{ yc?L
OW0
m_index++; #J3o~,t<
return *this; \P+^BG!
} $%\6"P/64
bit_iterator<Container>& operator++(int) qMVuFwPhi
{ !;(Wm6~*ad
m_index++; h[iO'Vq
return *this; kN1R8| pv
} "*D9.LyM
bool operator==(bit_iterator<Container>& bitIt)
anpKWa
{ g$#A'Du
return m_index == bitIt.m_index; "Y L^j~A
} t?-a JU
bool operator!=(bit_iterator<Container>& bitIt) r'#!w3*Cy
{ Qd YYWD
return !(*this == bitIt); u28$V]
} JD0s0>q_
protected: aV|VC$
Container* m_container; h M7 SGEV
private: 9#P~cW?
int m_size; y7:f^4
int m_index; K/Yeh<_&
}; ![ce }
y[.lfW?)
用该迭代器可以将任意类型对象以二进制格式输出: 467"pqT
double a = 10; UakVmVN/P
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));