以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 te&p1F
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 N.-*ig.YR7
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 a
t%qowt
象当作char数组来处理。 C0;:")6~
template<class Container> kjj?X|Un
class bit_iterator : public std::iterator<bidirectional_iterator_tag, tTPjCl
void, void> v+
"9&
{ r-5xo.J'
public: V(OD^GU
explicit bit_iterator(Container& c) : m_container(&c) ,<fs+oi
{ JjQ9AJ?-V
m_size = 8*sizeof(Container); TlJ'pG 4^
m_index = 0; 92Rm{n
} yS@xyW /
explicit bit_iterator() : m_container(0) %
r0AhWv
{ #w;%{C[D
m_size = 8*sizeof(Container); wZ/b;%I!
m_index = m_size; Env_??xq
} /y-8dgv0a
bool operator* () Zmy:Etqi
{ $rH}2
char mask = 1; 3'[
g2JR
char* pc = (char*)m_container; g>-u9%aa
int i = (m_size-m_index-1)/8; 47^7S=
int off = (m_size-m_index-1)%8; U9h@1:
mask <<=off; DaqpveKa
return pc & mask; mh8)yy5\
} "^5 %g%
bit_iterator<Container>& operator++()
!}L
cJ
{ Ui}%T]
m_index++; pt~b=+bBm
return *this; dA$qzQ
} Hw~?%g:<S
bit_iterator<Container>& operator++(int) 6='x}Qb \H
{ <[tU.nh
m_index++; iTJE:[W"y
return *this; I|)U>bV
} ?9;r|G
bool operator==(bit_iterator<Container>& bitIt) lM[FT=M
{ DQ= /Jr~
return m_index == bitIt.m_index; VHx:3G
} 6G<gA>V
bool operator!=(bit_iterator<Container>& bitIt) 1IWP~G
{ r*t\F&D
return !(*this == bitIt); nmUMg
} w7yz4_:x^
protected: qp2&Z8S\D
Container* m_container; zN,2
(v"
private: $
1v'CT
int m_size; xoN?[
int m_index; 9v(k<('_
}; 6>F]Z)]}
I=K|1
用该迭代器可以将任意类型对象以二进制格式输出: Yk
yB
double a = 10; p/'09FY+ U
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));