以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 yn=BO`sgW
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 H4DM,.04
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Q?df5{6
象当作char数组来处理。 E`68Z/%
template<class Container> ,e\'Y!'
class bit_iterator : public std::iterator<bidirectional_iterator_tag, .$nQD.X
void, void> zzlV((8~
{ :t?Z
public: Er(
I6
explicit bit_iterator(Container& c) : m_container(&c) :l~^un|<2Y
{ -Lh\]
m_size = 8*sizeof(Container); Ni]V)wGE;
m_index = 0; )`;Q]?D
} c^ $_epc*
explicit bit_iterator() : m_container(0) LLE\ ;,bv
{ dO/iL7K&
m_size = 8*sizeof(Container); rH@{[~p
m_index = m_size; m~`d<RM/
} D; xRgHn
bool operator* () N]gJ(g
{ hgt@Mb
char mask = 1; /SDN7M]m!
char* pc = (char*)m_container; G Y? ?q8
int i = (m_size-m_index-1)/8; h RK&
int off = (m_size-m_index-1)%8; g}(yq:D
mask <<=off; V`*N2ztSL
return pc & mask; 3$x[{\ {
} G i1Jl"
bit_iterator<Container>& operator++() dw'&Av'
|E
{ )S41N^j.
m_index++; 7K"{}:
return *this; )F_0('=t
} H?-Byi
bit_iterator<Container>& operator++(int) 8:*
{ %eK=5Er jx
m_index++; Sg#$
B#g
return *this; SrlTwcD
} &>Zm gz
bool operator==(bit_iterator<Container>& bitIt) 1<gY
{ \<k5c-8Hb
return m_index == bitIt.m_index; )Fe6>tE
} er<yB#/;-
bool operator!=(bit_iterator<Container>& bitIt) +f h@m
h0[
{ ']Q4SB"q
return !(*this == bitIt); !4"(>Rnw
} QH z3
protected: X/< zxM
Container* m_container; ~SKV%
private: .`./MRC
int m_size; 7 'T3Wc
int m_index; (i..7B:
}; c*>8VW>
}STTDq4
用该迭代器可以将任意类型对象以二进制格式输出: 4oxAC; L
double a = 10; dJvT2s.t[
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));