以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 4Ojw&ys@V
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 KPhqD5,
(
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 SJ-Sac58r
象当作char数组来处理。 ]lY9[~
v
template<class Container> loJ0PY'}=
class bit_iterator : public std::iterator<bidirectional_iterator_tag, wGH@I_cy>
void, void> DPOPRi~
{ Ah`dt8t
public: 4@I]PG
explicit bit_iterator(Container& c) : m_container(&c) s$_#T
{ K36B9<F
m_size = 8*sizeof(Container); g]#Wve
m_index = 0; _;{-w%Vf
} qg/5m;U
explicit bit_iterator() : m_container(0) I .ty-X]
{ z"#.o^5
m_size = 8*sizeof(Container); !)=o,sVA
m_index = m_size; CmOb+:4@K
} @gc"-V*-/
bool operator* () ;GSJnV
{ fLAF/#\2
char mask = 1; UJ[a&b
char* pc = (char*)m_container; $EIkk= z
int i = (m_size-m_index-1)/8; D,/9rH
int off = (m_size-m_index-1)%8; Ah6x2(:
mask <<=off; 08a|]li
return pc & mask; [Bo$?
} ihrrmlN?
bit_iterator<Container>& operator++() B(LV22#
{ val<N293L>
m_index++; (T01hR&
return *this; t,,^^ll
} v"+EBfx
bit_iterator<Container>& operator++(int) $wTX
{ .)w0C%]
m_index++; `uHpj`EU
return *this; G
m! ]
} F948%?a
bool operator==(bit_iterator<Container>& bitIt) {@AcL:Eit
{ o=QF>\\
return m_index == bitIt.m_index; 1\0@?6`^
} <*(R+to^d
bool operator!=(bit_iterator<Container>& bitIt) @`D6F;R
{ lv*uXg.k^
return !(*this == bitIt); 9,CC1f
} . $YF|v[=
protected: vM/v}6;_K2
Container* m_container; 5nAF =Bj
private: [)~@NN
int m_size; 1.uQ(>n
int m_index; su;S)yZb
}; a7G2C oM8
>>zoG3H!
用该迭代器可以将任意类型对象以二进制格式输出: KCE-6T
double a = 10; dAl<'~g
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));