以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 \2~Cn c*O
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 A6YkoYgC
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 a^t#kdT
象当作char数组来处理。 ZgVYC4=Q-\
template<class Container> p@!{Sh
class bit_iterator : public std::iterator<bidirectional_iterator_tag, _@wXh-nc
void, void> yyb8ll?@a
{ _"%mLH=!8
public: TC;2K,.#k
explicit bit_iterator(Container& c) : m_container(&c) ,rx?Ig}kz
{ 9#L0Q%,*
m_size = 8*sizeof(Container); 9E~=/Q=
m_index = 0; #u`i4
} (9$z+Zmm?
explicit bit_iterator() : m_container(0) MX2Zm
{ //S/pCqED
m_size = 8*sizeof(Container); NPF"_[RoeV
m_index = m_size; PMC5qQ%x
} ya8MjGo
bool operator* () W;en7v;#I}
{ =S7Xj`/
char mask = 1; ?G%C}8a
char* pc = (char*)m_container; %H Pwu &
int i = (m_size-m_index-1)/8; 'F.Da#st!}
int off = (m_size-m_index-1)%8; D&KRJQ/
mask <<=off; 1Ys6CJ#
return pc & mask; Ucr$5^ME
}
MgkeD
bit_iterator<Container>& operator++() qT}<D`\
{ feSd%
m_index++; KvW{M
return *this; C)66^l!x
} P Llad\
bit_iterator<Container>& operator++(int) |Am
+f.
{ 3.>M=K~09
m_index++; ?o307r
return *this; _{0'3tI7
} 5jAiqJq~y:
bool operator==(bit_iterator<Container>& bitIt) [S;ceORx
{ J3`a}LyDf
return m_index == bitIt.m_index; }wZ9#Ll
} I(!i"b9
bool operator!=(bit_iterator<Container>& bitIt) n?'I&0>M
{ 1 ~fD:
return !(*this == bitIt); y}Ji( q~
} 1h_TG.YL9>
protected: MHNuA,cz
Container* m_container; 91'i7&~xdG
private: foO/Yc
int m_size; %i[G6+-
int m_index; d^AXhQjQN-
}; \>,[5|GU
&p|+K
XIf
用该迭代器可以将任意类型对象以二进制格式输出: tP/0_^m
double a = 10; b?S,%
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));