以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 CaX&T2(
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 w8:~LX.n
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 1tHTjEG4^3
象当作char数组来处理。 8QV+DDZx
template<class Container> -8X*(7
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ;]3Tuq
void, void> ,YX[6eZr
{ N9 3
ZI|T
public: kep.+t[
explicit bit_iterator(Container& c) : m_container(&c) ~v$gk
{ Z#IRNFj
m_size = 8*sizeof(Container); 8
C @iD%
m_index = 0; ^|5bK_Z&
} )s4#)E1
explicit bit_iterator() : m_container(0) O:"gJ4D
{ ;]34l."85
m_size = 8*sizeof(Container); m;)[gF
m_index = m_size; a*o#,T5A
} }@_F( B
bool operator* () Ouc=4'$-
{ K]yCt~A$
char mask = 1; W!
v8'T
char* pc = (char*)m_container; H.qp~-n
int i = (m_size-m_index-1)/8; m7Nm!Z7
int off = (m_size-m_index-1)%8; ]e@'9`G-'
mask <<=off; P(8zJk6h),
return pc & mask; %,Xs[[?i
} N%'=el4L
bit_iterator<Container>& operator++() *aT3L#0(
{
3#}5dO
m_index++; ?u{y[pI6
return *this; cd)yj&:?Bt
} %Ak"d+OH4
bit_iterator<Container>& operator++(int) pi[:"}m]/P
{ /xj^TyWM
m_index++; SsiAyQ|Ma
return *this; r%A-
} c&z@HEzV7
bool operator==(bit_iterator<Container>& bitIt) )"s <hR,
{ eL[BH8l
return m_index == bitIt.m_index; h lD0^8S
} 7Rqjf6kX`O
bool operator!=(bit_iterator<Container>& bitIt) s|.V:%9e
{ $q.%4
return !(*this == bitIt); H]K(`)y}4
} Q"n|<!DN
protected: (E )@@p7,:
Container* m_container; @JVax -N
private: ZNNgi@6>
int m_size; N
'2Nv
int m_index; RZi]0l_A'
}; }DjW
#)QR^ss)iw
用该迭代器可以将任意类型对象以二进制格式输出: yyb8ll?@a
double a = 10; NCbn<ojb
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));