以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 zKllwIfi
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 J? 4E Hl
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ^T< HD
象当作char数组来处理。 UgP
template<class Container> P/ XO5`
class bit_iterator : public std::iterator<bidirectional_iterator_tag, k
x?m "a%
void, void> fvNj5Vq:
{ #
9@K
public: lK2=[%,~
explicit bit_iterator(Container& c) : m_container(&c) x)0''}E~
{ j7>a^W
m_size = 8*sizeof(Container); X{BS]
m_index = 0; s9\N{ar#
} Hgk@I;
explicit bit_iterator() : m_container(0) UNOKK_
{ oQ{
X2\
m_size = 8*sizeof(Container);
Pxy+W*t
m_index = m_size; x^XP<R{D
} &`LR{7m
bool operator* () ;JHR~ TV
{ zu!#
char mask = 1; oa"_5kn,
char* pc = (char*)m_container; \&,{N_G#L.
int i = (m_size-m_index-1)/8; j0.E!8Ae{
int off = (m_size-m_index-1)%8; G^W'mV$xl
mask <<=off; t4H*&U
return pc & mask; x1'4njTV$
} C9VtRq
bit_iterator<Container>& operator++() dm~Uj
{ p?H2W-
m_index++; ZP(T=Q
return *this; p\G1O*Z
} WMXxP gik
bit_iterator<Container>& operator++(int) zPyN2|iFah
{ }9*N EU)o
m_index++; {=Z _L?j
return *this; m2j]wUh"
} z 0-[ RGg
bool operator==(bit_iterator<Container>& bitIt) !;U;5 e=0
{ 87ptab@
return m_index == bitIt.m_index; k+%c8w 9
} FE4P
EBXvu
bool operator!=(bit_iterator<Container>& bitIt) g}gOAN3.
{ 6Z>G%yK
return !(*this == bitIt); `Re{j{~s
} *Me&>"N"
protected: HU47S
Container* m_container; Nq>"vEq)
private: zk^uS #
int m_size; +zINnX
int m_index; ^$x1~}D
}; M'sq{K9
"wj~KbT}&
用该迭代器可以将任意类型对象以二进制格式输出: H9Dw#.em
double a = 10; ~gA^tc3G
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));