以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 g{pQ4jKF
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 #A <1aQ
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 0kCQ0xB[a5
象当作char数组来处理。 <6N_at3
template<class Container> )wf\F6jN
class bit_iterator : public std::iterator<bidirectional_iterator_tag, q"aPJ0ni'
void, void> QV,E#(\5
{ nx4P^PC
public: P0\eBS
explicit bit_iterator(Container& c) : m_container(&c) 7$b?m6fmK
{ +p/1x'J
m_size = 8*sizeof(Container); Nh)[rx
m_index = 0; ekzjF\!y
}
Go+[uY^
explicit bit_iterator() : m_container(0) }_4 6y*o8
{ q/6UK =
m_size = 8*sizeof(Container); &y:CW>T$/X
m_index = m_size; <Dw]yGK@
} 6`puTL?
bool operator* () + Oobb-v
{ QXk"?yT`E
char mask = 1; u2qV 6/
char* pc = (char*)m_container; MguL$W&l
int i = (m_size-m_index-1)/8; c"Y!$'|Q
int off = (m_size-m_index-1)%8; 8l xY]UT
mask <<=off; T+TF-] J
return pc & mask; <]#o*_aFP
} -0~IY
bit_iterator<Container>& operator++() r*cjOrvI
{ ,8SWe
m_index++; ?ei%RWo
return *this; dm^H5D/A
} U'3Fou}
bit_iterator<Container>& operator++(int) *)PG-$6X&
{ <NQyP{p
m_index++; {$TZ}z"DA
return *this; E#h~V5Tf
} <%,'$^'DS
bool operator==(bit_iterator<Container>& bitIt) X!0kK8v
{ $j`<SxJ>
return m_index == bitIt.m_index; /e 5\ 9
} anx&Xj|=.F
bool operator!=(bit_iterator<Container>& bitIt) Q#rt<S1zW
{ IrO+5 w
return !(*this == bitIt); k46gY7y,9
} 9.Ap~Ay.
protected: OJ[rj`wrW^
Container* m_container; A
+!sD5d
private: Gc5VQ^]
int m_size; <:cpz* G4
int m_index; 0(TvQ{
}; h;n\*[fDc
jyjQzt
>\
用该迭代器可以将任意类型对象以二进制格式输出: ^('cbl
double a = 10; EX 9Z{xX
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));