以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 oIxH 3T
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 rJV?)=Z
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 7Ud'd<
象当作char数组来处理。 wv^b_DR
template<class Container> n1 v,#GE
class bit_iterator : public std::iterator<bidirectional_iterator_tag, W>$BF[x!{
void, void> c/'M#h)"
{ !g2a|g
public: <4f,G]UH_
explicit bit_iterator(Container& c) : m_container(&c) i| 4_m
{ F`srE6H
m_size = 8*sizeof(Container); GoD ?K C
m_index = 0; H&K3"Ulw
} `
FxtLG,F
explicit bit_iterator() : m_container(0) y||@?Y
{ blp=Hk
m_size = 8*sizeof(Container); vgo{]:Aj{
m_index = m_size; Q!]IG;3Sx|
} zX~}]?|9
bool operator* () u~}%1
{ <r;o6>+
char mask = 1; +6376$dC
char* pc = (char*)m_container; 3agNB F2
int i = (m_size-m_index-1)/8; i@6wO?Tv
int off = (m_size-m_index-1)%8; <I1y
mask <<=off; $',3Pv
return pc & mask; I.9o`Q[8&
} qguVaV4Y
bit_iterator<Container>& operator++() Z(UD9wY5m
{ *%?d\8d
m_index++; _>i|s|aW
return *this; Y}/c
N\
} k9&@(G[K3
bit_iterator<Container>& operator++(int) SB1[jcJ
{ VF=Z`
m_index++; I+~bCcgPi
return *this; 17i$8
} OAVQ`ek
bool operator==(bit_iterator<Container>& bitIt) 6Hn)pD#U
{ ob]dZ
return m_index == bitIt.m_index; _uJVuCc
} 8nsZ+,@+[
bool operator!=(bit_iterator<Container>& bitIt) avBu a6i'
{ L~
2q1
return !(*this == bitIt); (Y )!"_|
} ~v\hIm3=m
protected: RM#fX^)=
Container* m_container; zLK\I~rU!
private: 3G.r-
int m_size; avy=0Jmj
int m_index; J&_3VKrN
}; Jh^8xI,`C
)Oe`s(O@[I
用该迭代器可以将任意类型对象以二进制格式输出: N33AcV!*8
double a = 10;
Wxs>osq
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));