以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 *YY:JLe
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 $f<R j/`&
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 w-MnJ(r
象当作char数组来处理。 %!1:BQ,p,i
template<class Container> +EgQj*F*
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !~k-Sexh
void, void> <%rG*vzi
{ ^k?Ig.m
public: =2[cpF]
explicit bit_iterator(Container& c) : m_container(&c) 2myHn/%C
{ F D6>[W
m_size = 8*sizeof(Container); r&ex<(I{
m_index = 0; "%Eyb\V!
} v0} .!u>Ww
explicit bit_iterator() : m_container(0) r@(hRl1k'
{ n.Q?@\}2
m_size = 8*sizeof(Container); Y1vSwS%{T
m_index = m_size; ]"M 4fA
} s?*MZC
bool operator* () I6FglVQ6
{ N5[fwz
w
char mask = 1; (UTt_ry g
char* pc = (char*)m_container; TNC,{sM
int i = (m_size-m_index-1)/8; XA:v:JFS
int off = (m_size-m_index-1)%8;
Eyu?T
mask <<=off; 52#@.Qa
return pc & mask; s&$Zgf6Z
} QJ
s/0iw
bit_iterator<Container>& operator++() P
A9
]L
{ b9([)8
m_index++; S\jN:o#b
return *this; PRCr7f
} {N$G|bm]u<
bit_iterator<Container>& operator++(int) Re
b^w,
{ k^.9;FmQ
m_index++; '&}B"1
return *this; -K)P|'-?m
} g=:C/>g
bool operator==(bit_iterator<Container>& bitIt) ,saf"Ed=
{
D|n`9yv a
return m_index == bitIt.m_index; C@L:m1fz
} ?H3xE=<X
bool operator!=(bit_iterator<Container>& bitIt) _D(F[p|
{ =GjxqIv
return !(*this == bitIt); )vk$]<$
} t
<#Yr%a
protected: TlZ|E '_C
Container* m_container; \^3\_T&6
private: -U=bC
int m_size; u U>Bun
int m_index; X(#G6KeZFZ
}; t{K1ht$[:
W 6~B~L
用该迭代器可以将任意类型对象以二进制格式输出: 7@rrAs-"Z
double a = 10; ]pr;ME<M{
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));