以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 FJ/kumq
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 B4|3@X0(
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 CpA=DnZ
象当作char数组来处理。 XMpPG~XdN
template<class Container> @D%VV=N~[
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 6x_8m^+m
void, void> F<oJ
{ 4!D!.t~r
public: a&j
H9
explicit bit_iterator(Container& c) : m_container(&c) g8^ $,
{ qz?9:"~$C
m_size = 8*sizeof(Container); k9a-\UIMet
m_index = 0; VEJ Tw
} *T 6<'a
explicit bit_iterator() : m_container(0) vAX %i( 4
{ @A
g=2\9
m_size = 8*sizeof(Container); /|Zk$q.\
m_index = m_size; H`kfI"u8
} M>-x\[n+
bool operator* () yhZ 2-*pTg
{ hD
sFsG
char mask = 1; "zfy_h
char* pc = (char*)m_container; l]GLkE
int i = (m_size-m_index-1)/8; |ML|P\1&V
int off = (m_size-m_index-1)%8; ktnsq&qNL
mask <<=off; 1_%3cN.
return pc & mask; Rzw}W7zg[
} ~|riFp=J
bit_iterator<Container>& operator++() 0&zp9(G5
{ @N34 Q-l
m_index++; <.#i3!
return *this; fi`*r\
} C4ge_u#
bit_iterator<Container>& operator++(int) ``U>9S"p)
{ MK,#"Ty}zK
m_index++; ONg_3vD{
return *this; GkVV%0;&J1
} CPAizS
bool operator==(bit_iterator<Container>& bitIt) t '* L,
{ ^k/@y@%
return m_index == bitIt.m_index;
dCN4aY[d
} kowBB0
bool operator!=(bit_iterator<Container>& bitIt) G8H=xr#
{ </Ja@%
return !(*this == bitIt); |G }qY5_
} 5Q
=o.wf
protected: |}=xA%)
Container* m_container; bt"*@NJ$
private: \K55|3~R
int m_size; Xbe=_9l&p
int m_index; Sw%^&*J
}; /GqW1tcO
+uLl3(ml
用该迭代器可以将任意类型对象以二进制格式输出: sBt,y_LW
double a = 10; -6@#Nq_iWU
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));