以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 qG~6YCqii
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 8n2;47 a
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 UYy #DA
象当作char数组来处理。 {=J:
template<class Container> }C["'tLX
class bit_iterator : public std::iterator<bidirectional_iterator_tag, EAWBgOO8iC
void, void> %}~(%@qB>+
{ |9FrVO$M
public: UNv!G/i-5
explicit bit_iterator(Container& c) : m_container(&c) /7+b.h])^
{ !L9]nO 'BL
m_size = 8*sizeof(Container); c}),yQ|!:
m_index = 0; yEh{9S%6p
} ndN*X'
explicit bit_iterator() : m_container(0) >hG*=4oh
{ 87S,6 Y
m_size = 8*sizeof(Container); x}WP1YyT~
m_index = m_size; ;[P>
} 5f0g7w =-
bool operator* () #M#$2Vt
{ x)$0Nr62D
char mask = 1; :p)^+AF"5
char* pc = (char*)m_container; M5:*aCN6P
int i = (m_size-m_index-1)/8; jVoD9H
F/
int off = (m_size-m_index-1)%8; iY,oaC~?"N
mask <<=off; qZV|}M>P)
return pc & mask; g;[t1~oF
} ofz?L#:2
bit_iterator<Container>& operator++() '+iLW~
{ ;0 +Dx~
m_index++; km^ZF<. @
return *this; <ycR/X
} o F_{oV'
bit_iterator<Container>& operator++(int) Y1ca=ewFx
{ d9jD?HgM(
m_index++; sy4Nm0m
return *this; ld({1jpX,
} 1#AxFdm1
bool operator==(bit_iterator<Container>& bitIt) _tjexS'
{ .qYQ3G'V
return m_index == bitIt.m_index; !:esdJH
} L0=`1q
bool operator!=(bit_iterator<Container>& bitIt) LLzxCMc9*
{ UpSJ%%.n
return !(*this == bitIt); Ijz*wq\s;
} *M#L)c;6
protected: 6;!)^b
Container* m_container; #s>'IPc0
private: jRDvVV/-wr
int m_size; %{^|Av1Uz
int m_index; qJonzFp7
}; d,
?GW
D Vg$rm`
用该迭代器可以将任意类型对象以二进制格式输出: ?Oy0p8
double a = 10; cCx{
")
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));