以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 _>*TPlB
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 z!?xz
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 $1/yc#w
u
象当作char数组来处理。 |"\A5v|1
template<class Container> 4fp}`U
class bit_iterator : public std::iterator<bidirectional_iterator_tag, @7.Ews5Mke
void, void> y1@{(CDp"
{ vr2t MD
public: W!htCwnkF
explicit bit_iterator(Container& c) : m_container(&c) .y|*
{ >~2oQ[n
m_size = 8*sizeof(Container); 9Yd<_B#
m_index = 0; Ptn0;GC
} U%m,:b6V
explicit bit_iterator() : m_container(0) _@SC R%
{ uBH4E;[f
m_size = 8*sizeof(Container); jIg]?4bW[
m_index = m_size; @2Z{en?
} }eSaF@.
bool operator* ()
qN[U|3k
{ 08cCrG
char mask = 1; ioz4kG!
char* pc = (char*)m_container; -=@d2LY
int i = (m_size-m_index-1)/8; _KLKa/3
int off = (m_size-m_index-1)%8; 8+^q9rLii
mask <<=off; XeJn,=
return pc & mask; =J<3B
H^m
}
c7,p5[
bit_iterator<Container>& operator++() Qne@Vf kA
{ bRfac/:}
m_index++; ={B%qq
return *this; 9J$N5
} 4Zo.c*
BZ
bit_iterator<Container>& operator++(int) Wv8?G~>
{ KZ>cfv-&a
m_index++; =g
UOHH
return *this; MA6(VII
} J<yt/V]
bool operator==(bit_iterator<Container>& bitIt) $mgW|TBXCQ
{ gwm!Pw j
return m_index == bitIt.m_index; X0.k Q
} 4hz T4!15
bool operator!=(bit_iterator<Container>& bitIt) P XKEqcQR
{ l1l=52r
return !(*this == bitIt); jEVDz
} of659~EIW
protected: m%]1~b}"
Container* m_container; )%dxfwd6
private: j
4!$[h
int m_size; x8
_f/2&
int m_index; J;|a)Nw
}; %68'+qz
I() =Ufs5z
用该迭代器可以将任意类型对象以二进制格式输出: O`K2mt\%
double a = 10; Gh>&+UA'$1
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));