以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 &pLCN[a
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 -*&C "%e
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 tsqWnz=)
象当作char数组来处理。 R{Qvpd$y
template<class Container> ogKd}qTov
class bit_iterator : public std::iterator<bidirectional_iterator_tag, WevXQ-eKm
void, void> 7)v`l1
{ jTq@@y
public: Q##L|*Qy
explicit bit_iterator(Container& c) : m_container(&c) STQ~mFs"
{ &5;y&dh
m_size = 8*sizeof(Container); ( 0Z3Ksfj1
m_index = 0; =)y=39&;/
} lIL{*q(
explicit bit_iterator() : m_container(0) ,V:RE y
{ TGQDt|+Z
m_size = 8*sizeof(Container); ;Ajy54}7
m_index = m_size; N&+DhKw
} 7_ah1IEK
bool operator* () KdTna6nY
{ r$.v"Wh)
char mask = 1;
al:c2o
char* pc = (char*)m_container; Q\<^ih51
int i = (m_size-m_index-1)/8; TANt*r7
int off = (m_size-m_index-1)%8; AehkEN&H/t
mask <<=off; <E&"]
return pc & mask; *;C8g{
} zE<G wVI~
bit_iterator<Container>& operator++() 2wG4"
{ /Q[M2DN@
m_index++; }]?U.
]-
return *this; B3|r O
} ]&/KAk
bit_iterator<Container>& operator++(int) BHBMMjY5
{ l<mEGKB#
m_index++; k@= LR
return *this; P(BV J_n
} Z<0+<tt
bool operator==(bit_iterator<Container>& bitIt) M.R]hI
{ N%&D(_
return m_index == bitIt.m_index; )CC rO
} V2?&3Z)W
bool operator!=(bit_iterator<Container>& bitIt) xd`!z`X!,s
{ !56gJJ-r
return !(*this == bitIt); R]{AJ"p
} NQ(}rr'.
protected: tcxs%yWO1
Container* m_container; S4Vv _k-&
private: sZhl.[&zo
int m_size; QWBQ0#L
int m_index; \aO.LwYm;:
}; a,N?GxK~
nu#_,x<LS
用该迭代器可以将任意类型对象以二进制格式输出: p@7[w@B\c
double a = 10; UPkD^D,
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));