以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 R!`#pklB
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 7Sokn?~i
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 1i{B47|
象当作char数组来处理。 ;^;5"nh
template<class Container> Zhw _L
class bit_iterator : public std::iterator<bidirectional_iterator_tag, d(&vIjy
void, void> T]+*}C
{ 6;VlX,,j
public: YWTo]DJV
explicit bit_iterator(Container& c) : m_container(&c) McfSB(59
{ m<j ^cU#J
m_size = 8*sizeof(Container); \.{?TB
m_index = 0; zMDR1/|D
} .UJk0%1
explicit bit_iterator() : m_container(0) ym:JtI69
{ 4;_.|!LN
m_size = 8*sizeof(Container); Q)v8hNyUmA
m_index = m_size; sQR;!-j
} ]O 2_&cs
bool operator* () b{(:'.
{ Q.nEY6B_
char mask = 1; ?Hy++
char* pc = (char*)m_container; xx%WIY:}
int i = (m_size-m_index-1)/8; r+>9O
int off = (m_size-m_index-1)%8; 1~j.jv$
mask <<=off; %o~zsIl
return pc & mask; 1r@v
\#P
} }3@`'i7
bit_iterator<Container>& operator++() h~dM*yo;
{ -WEiY
m_index++; 1wwhTek
return *this; U5Rzfm4
} 1cUC>_%?
bit_iterator<Container>& operator++(int) rGoB&% pc
{ L/V3sSt
m_index++; EQg
6*V
return *this; ]t<%v_K
} /+'@}u
|
bool operator==(bit_iterator<Container>& bitIt) -5.>9+W8I
{ j&8U:Q,
return m_index == bitIt.m_index;
_,vJ0{*
} +1e*>jE
bool operator!=(bit_iterator<Container>& bitIt) t#kmtJC
{ 18a6i^7
return !(*this == bitIt); -O2QzzE&
} yp8 .\.
protected: sW[42A
Container* m_container; i3YAK$w;&
private: b%AYYk)d?
int m_size; X!r!lW
int m_index; enZW2o97c
}; ${`\In_?O
XxV]U{i!
用该迭代器可以将任意类型对象以二进制格式输出: qbB.Z#w
double a = 10; 3fpX
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));