以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 rR9|6l
3
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 2^mJ+v<
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Izhee%c
象当作char数组来处理。 ,sA[)wP {
template<class Container> g!$!F>[
class bit_iterator : public std::iterator<bidirectional_iterator_tag, YP.5fq:
void, void> r"``QmM
{ %X4xv_o`f
public: tk!t
Y8j
explicit bit_iterator(Container& c) : m_container(&c) TD'L'm|2
{ aGJC1x
m_size = 8*sizeof(Container); lG4H:[5V
m_index = 0; 'MEz|Z
} U}6.h&$
explicit bit_iterator() : m_container(0) OTGofd2zf
{ 4{hps.$?~
m_size = 8*sizeof(Container); X%Z{K-
m_index = m_size; @y='^DQ*
} 9:ze{ c $
bool operator* ()
i`QKH
{ |zQ4u
char mask = 1; P;P%n
char* pc = (char*)m_container; %MrWeYd1
int i = (m_size-m_index-1)/8; 0'V5/W
int off = (m_size-m_index-1)%8; )2V:
mask <<=off; eoai(&o0$
return pc & mask; (eCJ;%%k
} }`W){]{kO
bit_iterator<Container>& operator++() J6U$qi
{ *+j*{>E
m_index++; @x"0_Qw
return *this; LV\DBDM
} G B>QK
bit_iterator<Container>& operator++(int) rs,2rSsg!
{ +Vm}E0Ov
m_index++; 2q3+0Et8
return *this; )Y2{_ bx4"
} MS\>DW
bool operator==(bit_iterator<Container>& bitIt) !G SV6
{ v%"|WV[N
return m_index == bitIt.m_index; 85n1eE
} D}dn.$
bool operator!=(bit_iterator<Container>& bitIt) iVB86XZ`
{ wF|fK4F
return !(*this == bitIt); NWM8[dI
} k.uMp<)D
protected: RRRCS]y7$t
Container* m_container; MYla OT
private: ^Wc@oa`
int m_size;
0Uo\wyd
int m_index; J4Nln
}; AtdlZ
]|MEx{BG-
用该迭代器可以将任意类型对象以二进制格式输出: .Xce9C0SW
double a = 10; ( M7pT
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));