以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 PTfy#
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 (>THN*i
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 f
n9[Li
象当作char数组来处理。 .6Swc?
template<class Container> Jsi [,|G
class bit_iterator : public std::iterator<bidirectional_iterator_tag, =]h 5RC
void, void> zi~_[l-
{ ~Uw**PT3M
public: ;m{*iKL6{
explicit bit_iterator(Container& c) : m_container(&c) 2.=3:q!H<%
{ X4emhB
m_size = 8*sizeof(Container); YKwej@9,
m_index = 0; i7:R4G(/#
} $QQv$
explicit bit_iterator() : m_container(0) e[fzy0
{ @q9uU9c
m_size = 8*sizeof(Container); HH[b1z2D
m_index = m_size; |t^7L )&y
} ag*RQ
bool operator* () lc/q0
{ "|{O%X
char mask = 1; >jjuWO3T
char* pc = (char*)m_container; ~c7}eTJd"
int i = (m_size-m_index-1)/8; 45l/)=@@B
int off = (m_size-m_index-1)%8; ,?;q$Xoi
mask <<=off; T"Ph@I<
return pc & mask; 2F(zHa
} Ilvz@=
bit_iterator<Container>& operator++() *V(TNLIh;
{ "J(#|v0
m_index++; 1bb~u/jU
return *this;
'ypJGm
} is`Eqcj`dr
bit_iterator<Container>& operator++(int) 0}]k>ndT
{ {.2A+JT,
m_index++; ^y"Rdv
return *this; E<;C@B
} 1,fjdd8OM;
bool operator==(bit_iterator<Container>& bitIt) ot P7;l
{ w^09|k
return m_index == bitIt.m_index; l+S08IZ
} <\c5
bool operator!=(bit_iterator<Container>& bitIt) 4-efnB
{ v/6QE;BY&Q
return !(*this == bitIt); Oa=0d;_
} O G#By6O
protected: -?n|kSHX
Container* m_container; ZK4/o
private: s<x2*yVUA
int m_size; U]Q2EL\%
int m_index; }./__gJ
}; h0`@yo
tv,iCV
用该迭代器可以将任意类型对象以二进制格式输出: {4tJT25
double a = 10; L}CjC>R!
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));