以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 S(*u_
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 =17d7#-
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 0<ze'FbV]
象当作char数组来处理。 04o>POR
template<class Container> K14FY2"
class bit_iterator : public std::iterator<bidirectional_iterator_tag, u?Pec:3%
void, void> [2~^~K
{ d `eX_] Z
public: UYLCzv~W
explicit bit_iterator(Container& c) : m_container(&c) ,oin<K
{ :`jB1rI
m_size = 8*sizeof(Container); z?Hi
u6c-
m_index = 0; /2s=;tA1
} Hsdcv~Xr;l
explicit bit_iterator() : m_container(0)
19#s:nt9
{ 1:Sq?=&
m_size = 8*sizeof(Container); nr*nX
m_index = m_size; yzH(\ x
}
EU5^"\
bool operator* () )~>
C1<
{ d2~*fHx_!
char mask = 1; =qWcw7!"
char* pc = (char*)m_container; q7#4e?1
int i = (m_size-m_index-1)/8; g]$e-X@k
int off = (m_size-m_index-1)%8; P0 4Q_A
mask <<=off; | XGj97#M
return pc & mask; S1vUP5cZ
} -e2f8PV?3
bit_iterator<Container>& operator++() 5I`_SOa!
{ Yo-$Z-ud
m_index++; PH1jN?OEwZ
return *this; ]?un'$%e
} >IT19(J;A
bit_iterator<Container>& operator++(int) t ZL|;K
{ s@$SM,tnn
m_index++; 6x*$/1'M3;
return *this; 59R%g .2Y
} ;:WM^S
bool operator==(bit_iterator<Container>& bitIt) Hoj'zY
{ yhPO$L
return m_index == bitIt.m_index; xGkc_
} Kb$6a'u7
bool operator!=(bit_iterator<Container>& bitIt) L>3- z>u,
{ #qnK nxD
return !(*this == bitIt); /l%+l@
} w/49O;r V
protected: #{8t
?v l
Container* m_container; +|K/*VVn`
private: [gkOwU=?
int m_size; =JW.1;
int m_index; C
CDO8
}; cVYPPal
}+/F?_I=
%
用该迭代器可以将任意类型对象以二进制格式输出: R9q9cBi3
double a = 10; '=V1'I*
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));