以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Yw<K!'C
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 &GcWv+p
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 TjGe8L:
象当作char数组来处理。 LX[J6YKR
template<class Container> iy Zs:4jkc
class bit_iterator : public std::iterator<bidirectional_iterator_tag, PhF3' ">
void, void> Lz2 AWqR
{ &*RJh'o|N(
public: =YkJS%)M)
explicit bit_iterator(Container& c) : m_container(&c) @ 'rk[S}A
{ 2`/JT
m_size = 8*sizeof(Container); P9vN5|"M
m_index = 0; Z3Os9X9p
} *xXa4HB
explicit bit_iterator() : m_container(0) mV0F^5
{ q05_5
m_size = 8*sizeof(Container); @47MJzC
m_index = m_size; w}^z1n
} n.p6+^ES
bool operator* () 7. 9n
{ !EuU
@+
char mask = 1; qYc]Y9fi
char* pc = (char*)m_container; 72@raA#y
int i = (m_size-m_index-1)/8; l~Je]Qt
int off = (m_size-m_index-1)%8; :<4:h.gO8
mask <<=off; FW(y#Fmqs
return pc & mask; :Eq=wbAw
} T1c2J,+}R
bit_iterator<Container>& operator++() mw";l$Aq}
{ C,+6g/{
m_index++; nJ |O,*`O
return *this; 8P.UB{QNe
} X6%w6%su5
bit_iterator<Container>& operator++(int) v;AMx-_WH
{ ]W3D4Swq
m_index++; kxp$Nnk
return *this; 'CsD[<
} Q3,`'[ F
bool operator==(bit_iterator<Container>& bitIt) U8kH'OD
{ _ In[Z?P}
return m_index == bitIt.m_index; 7
N+;K0
} *`[dC,+`.
bool operator!=(bit_iterator<Container>& bitIt) Px5ArSS
{ My0h9'K
return !(*this == bitIt); ~` v7
} @kC>+4s!
protected: -Czq[n=0(
Container* m_container; [4sI<aH
private: J
Sz'oA5
int m_size; ,A9pj k'
int m_index; Ps5UX6\ .m
}; =wHHR1e
LivPk`[
用该迭代器可以将任意类型对象以二进制格式输出: #=UEx
double a = 10; -~ytk=
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));