以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 $Q4=37H+
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 #`j][F@N
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 2nx9#B*/T
象当作char数组来处理。 WF)s*$'uz;
template<class Container> r~[B_f!
class bit_iterator : public std::iterator<bidirectional_iterator_tag, K\X: G-C9
void, void> Mdky^;qq3;
{ 9cOx@c+/
public: E$T(Qu<-
explicit bit_iterator(Container& c) : m_container(&c) A\C'dZ <N
{ 'bm:u
m_size = 8*sizeof(Container); IHVMHOq}'
m_index = 0; yfq>,
} yjeL9:jH[
explicit bit_iterator() : m_container(0) q
u:To7
{ h,hL?imD
m_size = 8*sizeof(Container); 1(pjVz&
m_index = m_size; hfh.eL
} xPvRQ
bool operator* () x@ 6\Ob
{ acP
;(t
char mask = 1; DvJB59:_}
char* pc = (char*)m_container; !VNbj\Bp
int i = (m_size-m_index-1)/8; O*4gV }:G
int off = (m_size-m_index-1)%8; ?'f^X$aS
mask <<=off; 6JWGu/A
return pc & mask; U6a zhi&,
} !5E9sk{)
bit_iterator<Container>& operator++() *2#FRA#q
{ P#F_>GB
m_index++; q]+)c2M
return *this; ?.j,Bq5At
} 2MT_#r_
bit_iterator<Container>& operator++(int) *JS"(. '(
{ um}N%5GAa
m_index++; 44<v9uSK
return *this; _r7=&oL.Q
} =N;$0Y(g
bool operator==(bit_iterator<Container>& bitIt) neIy~H_#!
{ 1:YAn
return m_index == bitIt.m_index; hy=u}^F.C
} 8L{$v~ +
bool operator!=(bit_iterator<Container>& bitIt) b_l.QKk
{ tgfM:kzw
return !(*this == bitIt); {a@hRY_
} $~TfL{$
protected: aa!a&L|!
Container* m_container; }JH`'&3
private: Hz5;Ruw'
int m_size; sM0c#YK?
int m_index; [[&)cbv
}; WRY~fM
ny~W]1
用该迭代器可以将任意类型对象以二进制格式输出: T7ki/hjRb
double a = 10; G ;jF9i
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));