以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 x=UwyZ
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 X=:|v<E
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Ez3>}E,
象当作char数组来处理。 L(p{>Ykcc
template<class Container> H`js1b1n
class bit_iterator : public std::iterator<bidirectional_iterator_tag, IfGmA.O
void, void> 6#,VnS)`q
{ 4CzT<cp
public: 0Zt=1Tv
explicit bit_iterator(Container& c) : m_container(&c) >S3,_@C
{
G_fP%ovh
m_size = 8*sizeof(Container); Dr;-2$Kt/&
m_index = 0; U"1z"PcV
} c$cb2V7,
explicit bit_iterator() : m_container(0) c.-/e u^|
{ #].n0[
m_size = 8*sizeof(Container); R]0p L
m_index = m_size; `N+A8
} bN Ub
bool operator* () mkA1Sh{hX>
{ RXMzwk
char mask = 1; u7rA8u|TO
char* pc = (char*)m_container; eXHk6[%[
int i = (m_size-m_index-1)/8; +=XDNSw
int off = (m_size-m_index-1)%8; (J c} K
mask <<=off; ZT
UaF4k j
return pc & mask; e <Hbm
} ;.=ZwM]C
bit_iterator<Container>& operator++() O!0YlIvWv
{ 3?Ml]=u
m_index++; =hs
!t|(*
return *this; mSn>
} 24ojjxz+
bit_iterator<Container>& operator++(int) yfBVy8Sm
{ \DP*?D_}?
m_index++; )c'5M]V
return *this; Ca: jN0
} Tgpf0(
bool operator==(bit_iterator<Container>& bitIt) j,q8n`@
{ =j%B`cJ66_
return m_index == bitIt.m_index; y*Egt `W
} .hYrE5\-
bool operator!=(bit_iterator<Container>& bitIt) `+IB;G1
{ 6g/ <FM
return !(*this == bitIt); 2>l
=oXq
} ~$#"'Tl4J
protected: (dOC ^i
Container* m_container; ubC(%Y_k
private: `yjHLg
int m_size; ]9xuLJ)
int m_index; '@Zau\xC
}; B8+J0jdg6%
q Ee1OB
用该迭代器可以将任意类型对象以二进制格式输出: 8.-0_C*U;
double a = 10; w\
hl2JTy
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));