以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 FTsvPLIv"
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ?V3e;n
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 QJjqtOf>
象当作char数组来处理。 h%9#~gJ})
template<class Container> ZG"_M@S.
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 5L'X3g
void, void> s,)Z8H
{ 9s7sn*aB#5
public: M<4~ewWJ
explicit bit_iterator(Container& c) : m_container(&c) s sUWr=mD
{ -J[*fv@
m_size = 8*sizeof(Container); sFuB[
JJ}
m_index = 0; 4[v
%]g`
} IZoS2^:yw
explicit bit_iterator() : m_container(0) !8(:G6Ne
{ 9{]U6A*K0w
m_size = 8*sizeof(Container); vlY83mU.
m_index = m_size; bk44qL;8
} JmjqA Dex
bool operator* () :q/%uca9
{ K!;Z#$iw[
char mask = 1; 9@/X;zO
char* pc = (char*)m_container; 6w|s1!Bl
int i = (m_size-m_index-1)/8; >|'u:`A
int off = (m_size-m_index-1)%8; #`?B:
mask <<=off; 7VduewKX8
return pc & mask; yY_Zq\
}
p"\Z@c
bit_iterator<Container>& operator++() JvX]^t/}
{ .zZee,kM
m_index++; s]@()?.E$
return *this; b"DaLwKkz
} L3/m}AH,
bit_iterator<Container>& operator++(int) F !g>fIg
{ o'O;69D]tX
m_index++; LVP2jTz
return *this; 38#BINhBt
} wc`UcGO
bool operator==(bit_iterator<Container>& bitIt) nLicog)!I
{ F!(Vg
return m_index == bitIt.m_index; H0r@dn
} I7,5ID4pn
bool operator!=(bit_iterator<Container>& bitIt) F,5~a_GP?
{ '_oWpzpe
return !(*this == bitIt); %? -E)n[
} BJC$KmGk
protected: $P
rji
Container* m_container; c&me=WD
private: z-ns@y(f@X
int m_size; *oZ]k`-!8
int m_index; .^
djt
}; &8$Gyu
c_wvuKa
用该迭代器可以将任意类型对象以二进制格式输出: o{MF'B#
double a = 10; +L(|?|i8
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));