以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Sdl1k+u
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 z;GR(;w/
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 c=iv\hn
象当作char数组来处理。 kGsd3t!'
template<class Container> ,C%fA>?UF8
class bit_iterator : public std::iterator<bidirectional_iterator_tag, hm"i\JZ3N
void, void> Z<6XB{Nh\
{ [m3[plwe
public: 1'wwwxe7
explicit bit_iterator(Container& c) : m_container(&c) og<mFbqkq7
{ C
7)w8y
m_size = 8*sizeof(Container); X#KC<BXw,
m_index = 0; <<}t&qE%2%
} Fp52|w_
explicit bit_iterator() : m_container(0) ] RgLTqv4x
{ WV]%llj^
m_size = 8*sizeof(Container); ]]~tFdh
m_index = m_size; 9Ml^\|
} m%Ah]x;
bool operator* () AsyJDt'i
{ B -XM(Cj
char mask = 1; Ffxf!zS
char* pc = (char*)m_container; X_yAx)Do
int i = (m_size-m_index-1)/8; Gzxq] Mg
int off = (m_size-m_index-1)%8; jU\vg;nr
mask <<=off; ?;Ck]l#5ys
return pc & mask; Gq_rZo(@
} $xRZU9+
bit_iterator<Container>& operator++() 56 k89o
{ VPG+]>*
m_index++; 0J-]
return *this; {kGcZf3h
} ]PQ] f*Ik>
bit_iterator<Container>& operator++(int) 'r;C(Gh6
{ 0'T*l2Z`2
m_index++; gFR9!=,/V%
return *this; >\=~2>FCD
} VhdMKq~`
bool operator==(bit_iterator<Container>& bitIt) "J|_1! 9
{ fx&b*OC
return m_index == bitIt.m_index; $^|I?5xD
} *7: )k
bool operator!=(bit_iterator<Container>& bitIt) bvY'=
{ !QK~l
return !(*this == bitIt); *7.EL`8
} 6% +s`
protected: `NIc*B4q.
Container* m_container; gd~# uR\
private: zrD];DP
int m_size; &?\'Z~B4
int m_index; ^MJT lRUb
}; ATq)8Rm\
hs'J'~a
用该迭代器可以将任意类型对象以二进制格式输出:
X$:r
double a = 10; %n<u- {`
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));