以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Ld|V^9h1;
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 #rYENR[
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 cub<G!K
象当作char数组来处理。 ^`qPs/b
template<class Container> p11G#.0
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Jll-X\O`-
void, void> O hR1Jaed
{ rFL$QC2
public: 396R$\q
explicit bit_iterator(Container& c) : m_container(&c) .%0ne:5
{ Z]:BYX'
m_size = 8*sizeof(Container); yD)"c.
m_index = 0; RwTzz]
M
} X^@[G8v%
explicit bit_iterator() : m_container(0) qA/bg
{ ^i:\@VA:
m_size = 8*sizeof(Container); J%dJw}
m_index = m_size; Vul+]h[!h
} q3'o|pp
bool operator* () )8{6+{5lu
{ j:1uP^.
char mask = 1; i!MwBYk
char* pc = (char*)m_container; p`+VrcCBOd
int i = (m_size-m_index-1)/8; /4joC9\AB
int off = (m_size-m_index-1)%8; :nQp.N*p
mask <<=off; RFG$X-.e
return pc & mask; qvLDfN
} i|\{\d
bit_iterator<Container>& operator++() a]VGUW-
{ @5}gsC
m_index++; S@:B6](D$
return *this; %3a|<6
} (clU$m+oXX
bit_iterator<Container>& operator++(int) [l[{6ZXt
{ "'eWn6O(
m_index++; pX<a2FP
return *this; S>ugRasZ$
} B[xR-6phW
bool operator==(bit_iterator<Container>& bitIt) te2
Iu%5 z
{ '.p? 6k!K
return m_index == bitIt.m_index; "jZm0U$,*
} Qm);6X
bool operator!=(bit_iterator<Container>& bitIt) cj(X2L
{ hswTn`f
return !(*this == bitIt); f:%SW
} mpef]9
protected: !z=pP$81
Container* m_container; &
QY#3yj=
private: 2X@G"
int m_size; } 21j
int m_index; .u< U:*
}; LC'2q*:'
( D}"&2
用该迭代器可以将任意类型对象以二进制格式输出: U4_"aT>My
double a = 10; J`Oy .Qu)
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));