以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 -5>-%13
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 `I$<S(h7
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 qQi.?<d2"s
象当作char数组来处理。 thO ~=RB
template<class Container> Ko&hj XHx
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !}\4utHY
void, void> /<CSVJ_r
{ @\oz4^
public: v]%WH~>
explicit bit_iterator(Container& c) : m_container(&c) dLsn\m>
{ xCzebG["
m_size = 8*sizeof(Container); _ 7PMmW@
m_index = 0; >StO.Q99
} fW`&'!
explicit bit_iterator() : m_container(0) kY,U8a3!
{ 1C Pjil*eb
m_size = 8*sizeof(Container); Iq+>qX
m_index = m_size; MC0TaP
} #zrTY9m7
bool operator* () e}@)z3Q<l
{ `6y{.$ z
char mask = 1; .*$OQA
char* pc = (char*)m_container; ;n=. {[,
int i = (m_size-m_index-1)/8; ~'5
int off = (m_size-m_index-1)%8; Uw-p758dD
mask <<=off; \ 6EKgC1
return pc & mask; LAx4Xp/
} 1iL'V-y
bit_iterator<Container>& operator++() 6OiSK@<Hk
{ [U#72+K
m_index++; T&T/C@z'R
return *this; 58%'UwKn
} ?6c-7QV
bit_iterator<Container>& operator++(int) P^MOx4
{
Pi%%z
m_index++; d0hhMx6$
return *this; s%iOUL2/
} }
B396X
bool operator==(bit_iterator<Container>& bitIt) Kx"<J@
{ SxyONp.$\
return m_index == bitIt.m_index; w|mb4AyL{?
} KtS)'jf
bool operator!=(bit_iterator<Container>& bitIt) d|Gl`BG
{ EA.D}X C
return !(*this == bitIt); M,j(=hRJ/E
} zPEg
protected: juAMAplf
Container* m_container; 2;L|y._`w
private: !$A 37j6
int m_size; m`4R]L]
int m_index; RWgDD;&_[a
}; *xf ._~E
6b8;}],|
用该迭代器可以将任意类型对象以二进制格式输出: 3$vRW.c\q
double a = 10; Md)zEj`\
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));