以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ,wV2ZEW}e
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 y.nw6.`MR
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 li{_biey}
象当作char数组来处理。 y8L:nnSj
template<class Container> VltWY'\Wu;
class bit_iterator : public std::iterator<bidirectional_iterator_tag, [B4?Z-K%
void, void> d_`Ze.^
{ 0jXIx2y
public: Q6BWax|
explicit bit_iterator(Container& c) : m_container(&c) -K0tK~%q
{ ?`vb\K<5H;
m_size = 8*sizeof(Container); wFvilF
V
m_index = 0; +k>v^sz
} 84{<]y
explicit bit_iterator() : m_container(0) N
8OPeY
{ UY+~xzm
m_size = 8*sizeof(Container); /b*@dy
m_index = m_size; kC+A7k6
} X;1q1X)K
bool operator* () ;2iZX=P`n
{ TnG"_VK9R
char mask = 1; IV*}w"r
char* pc = (char*)m_container; p+t8*lkq
int i = (m_size-m_index-1)/8; {T IGPK
int off = (m_size-m_index-1)%8; ]-6 G'i?
mask <<=off; Li'T{0)1)
return pc & mask; f 6q@
} \u*,~J)z
bit_iterator<Container>& operator++() !y),| #7P
{ %:y-"m1\u$
m_index++; NE! Xt <A
return *this; +)Ty^;+[1
} YT_kMy>
bit_iterator<Container>& operator++(int) &F:7U!
{ f`c z@
m_index++; 3.jwOFH$
return *this; LDNpEX~
} OYKV*
bool operator==(bit_iterator<Container>& bitIt) ]}B&-Yp
{ D(&OyZ~Q+
return m_index == bitIt.m_index; +LyhF2
} l}wBthwCc
bool operator!=(bit_iterator<Container>& bitIt) e7;]+pN]J
{ sJD"u4#y
return !(*this == bitIt); }'{(rU
} |QY+vO7fxj
protected: &M2x`
Container* m_container; RBb@@k[v
private: saZ;ixV
int m_size; Y7p#K<y]9
int m_index; ?G{fF
H
}; b,'./{c0
?SpI^Wn)[
用该迭代器可以将任意类型对象以二进制格式输出: _ %P%~`?!
double a = 10; F 6Ol5
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));