以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 eT+i&
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 T?Kh'
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 WW+xU0
象当作char数组来处理。 -=nk,cYn
template<class Container> u"q56}Q?]
class bit_iterator : public std::iterator<bidirectional_iterator_tag, vP x/&x
void, void> ~v%6*9
{ ?V,q&=9
public: uLafO=Q
explicit bit_iterator(Container& c) : m_container(&c) w%.hALN5-C
{ X8VBs#tLE
m_size = 8*sizeof(Container); /i3JP}
m_index = 0; )O" E#%
} Qn7T{ BW
explicit bit_iterator() : m_container(0) 5]>*0#C
S
{ a;t}'GQGk
m_size = 8*sizeof(Container); ._^}M<o L
m_index = m_size; 0W(mx-[H/
}
][wb4$2
bool operator* () ]R_R`X?
{ n9xP8<w8
char mask = 1; Iz1x| EQ
char* pc = (char*)m_container; [a04(
2g
int i = (m_size-m_index-1)/8; `p&[b]b
int off = (m_size-m_index-1)%8; >*RU:X
mask <<=off; Hl`OT5pNf
return pc & mask; HD^#"
} `wXK&R<`
bit_iterator<Container>& operator++() Ww,\s5Uw
{ }9+;-*m/
m_index++; uR ?W|a
return *this; j@>D]j
} q0NFz mG
bit_iterator<Container>& operator++(int) W}f)VC;D
{ }:m/@LKB
m_index++; ux<|8S
return *this; o5bp~.m<
} 1ZI1+TDH
bool operator==(bit_iterator<Container>& bitIt) M@R"-$Z
{ S3\NB3@qC&
return m_index == bitIt.m_index; eCYPd-d
} Fp/{L
bool operator!=(bit_iterator<Container>& bitIt) C3}:DIn"w
{ >G:Q/3jh
return !(*this == bitIt); H].|K/-p
} 1Ng+mT
protected: >\d&LLAe
Container* m_container; =p8uP5H
private: BB6[(Z
int m_size; ^O18\a
int m_index; I.n,TJoz4J
}; xvV";o
BM<q;;pO
用该迭代器可以将任意类型对象以二进制格式输出: _K o#36.S
double a = 10; k
ucbI_
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));