以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 >A@Y$.
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 R+&jD;U{
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 71vkyn@"
象当作char数组来处理。 R(n^)^?
template<class Container> 5jUYN-$GO
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Gs3LB/8?
void, void> )T;?^kho
{ [oF|s-"9!
public: TEDAb>
explicit bit_iterator(Container& c) : m_container(&c) oh$Q6G
{ H,N)4;F<c
m_size = 8*sizeof(Container); F<!)4>2@
m_index = 0; qhT@;W/X
} X^WrccNX
explicit bit_iterator() : m_container(0) Y(44pA&oN
{ ` AY_2>7
m_size = 8*sizeof(Container); irN6g#B?
m_index = m_size; ?JL:CBvCp
} }#X8@
bool operator* () K~22\G`
{ ar:+;.n
char mask = 1;
<vXGi
char* pc = (char*)m_container; AE} )o)B
int i = (m_size-m_index-1)/8; U#3J0+!
int off = (m_size-m_index-1)%8; cK 06]-Y
mask <<=off; 1 5A*7|
return pc & mask; Yot?=T};3{
} y.[Mnj
bit_iterator<Container>& operator++() ;pnD0bH
{ YfRkwKjy(
m_index++; $^@ )
return *this; +"1NC\<*
} H/Llj.-jg
bit_iterator<Container>& operator++(int) E8-P"`Qba
{ ZcaX'5}!S
m_index++; e@IA20
return *this; 9~ l
hsH
} 5|1T}Z#;
bool operator==(bit_iterator<Container>& bitIt) KCWc`Oz
{ C*`mM'#
return m_index == bitIt.m_index; X$yN_7|+
} c
9jGq
bool operator!=(bit_iterator<Container>& bitIt) sVl-N&/
{ og0*Nt+
return !(*this == bitIt); v'BZs
} v$N|"o""
protected: 9ksE>[7
Container* m_container; 8H_l:Z [:i
private: ;g~TWy^o
int m_size; 9k 6r_G"
int m_index; N&M~0iw
}; }X=[WCKU
SI=yI-
用该迭代器可以将任意类型对象以二进制格式输出: U{VCZ*0cj
double a = 10; (<)]sp2
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));