以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 !Zc#E,
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 gdyWuOxa|
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ka(3ONbG
象当作char数组来处理。 U!BZsVx
template<class Container> P~x4h{~Gd
class bit_iterator : public std::iterator<bidirectional_iterator_tag, =W"T=p*j
void, void> H3iYE~^#
{ qzZ;{>_f
public: &=T>($3r94
explicit bit_iterator(Container& c) : m_container(&c) c3<H272\
{ W>b\O">
m_size = 8*sizeof(Container); am| 81)|a
m_index = 0; 7<2^8`
} o(D_ /]'8
explicit bit_iterator() : m_container(0) (58r9WhS
{ cmd7-2
m_size = 8*sizeof(Container); x%W~@_
m_index = m_size; ox";%|PP1
} +I:/8,&-x
bool operator* () ;uZeYY?
{ F<*zL:-Z
char mask = 1; c%
?@3d
char* pc = (char*)m_container; cb. -AlqQ
int i = (m_size-m_index-1)/8; tpgD{BY^wJ
int off = (m_size-m_index-1)%8; )!
kl:
mask <<=off; `:0Auw9h
return pc & mask; VPVg\K{
} +lf`Dd3
bit_iterator<Container>& operator++() &*Kk>
4
{ yVpru8+eD
m_index++; uFvR(LDb&g
return *this; yU~wZjw
} 7o7FW=^
bit_iterator<Container>& operator++(int) 8ddBQfCY
{ Y%zWaH
m_index++; Tg=P*HY6
return *this; x69RQ+Vw
} md/h\o&
bool operator==(bit_iterator<Container>& bitIt) S]&aDg1y}
{ ClPE_Cfw~
return m_index == bitIt.m_index; CRNt5T>qH
} [l~G7u.d
bool operator!=(bit_iterator<Container>& bitIt) \r3SvBwhFv
{ j5~~%
return !(*this == bitIt); 4#B56f8
} scE#&OWF%
protected: sv6m)pwh
Container* m_container; =&: |a$C
private: S.U#lAn(
int m_size; :{KpnJvd
int m_index; u})8)
}; #3FsK
sWVapup?
用该迭代器可以将任意类型对象以二进制格式输出: JEeXoGKd
double a = 10; +z~bH!$2
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));