以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 @i$9c)D
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 go@UE2qw
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ' n#;~
象当作char数组来处理。 *y='0)[BD
template<class Container> b{b2L.
class bit_iterator : public std::iterator<bidirectional_iterator_tag, O!\P]W4r$
void, void> 25::z9i
{ tl
(2=\
public: KArR.o }
explicit bit_iterator(Container& c) : m_container(&c) _K_!(]t
{ QDF1$,s4i
m_size = 8*sizeof(Container); (UAa
m_index = 0; C~yfuPr\B
} 1*Yf[;L
explicit bit_iterator() : m_container(0) V&eti2&zO
{ UMma|9l(i
m_size = 8*sizeof(Container); Gvb>M=9
m_index = m_size; wbyY?tH
} nz3j";d
bool operator* () ?nn`ud?f
{ o6'I%Gs
char mask = 1; h*Rh:yCR>
char* pc = (char*)m_container; *}-X
'_
int i = (m_size-m_index-1)/8; I_6?Q^_uZ
int off = (m_size-m_index-1)%8; <_dyUiT$J
mask <<=off; `kpX}cKK}
return pc & mask; X2}\i5{
} hJ (Q^Z
bit_iterator<Container>& operator++() 1j`-lD
{ Q&opnvN
m_index++; lQ<2Vw#Yl
return *this; +\fr3@Yc
} =!*e; L
bit_iterator<Container>& operator++(int) j#f+0
{ C\ZL*,%}
m_index++; xdd7OSc0{
return *this; 0~iC#lHO
} rr>QG<i;G
bool operator==(bit_iterator<Container>& bitIt) iKnH6}`?U
{ r`qMif'
return m_index == bitIt.m_index; w4Qqo(
} [2pp)wq
bool operator!=(bit_iterator<Container>& bitIt) 6iVjAxR
{ '_lyoVP
return !(*this == bitIt); L'BDS*
} 5bYU(]
protected: : ^F+mQN
Container* m_container; CC0@RU
private: AON";&dLq-
int m_size; HgvgO\`]
int m_index; 0&mo1 k_U
}; @zL)R b%P$
!
@{rkp
用该迭代器可以将任意类型对象以二进制格式输出: 1P.
W 34
double a = 10; ^VK-[Sz&
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));