以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 sX
Z4U0#
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 !9PX\Xbn
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 t)KPp|&
象当作char数组来处理。 ,,7.=#
template<class Container> l*qk1H"g
class bit_iterator : public std::iterator<bidirectional_iterator_tag, w~p4S+k&
void, void> sc9]sIb
{ OFp#<o,p
public: $8=(I2&TW
explicit bit_iterator(Container& c) : m_container(&c) my]P_mE
{ hj+p`e S
m_size = 8*sizeof(Container); :Fc8S9
m_index = 0; -&$%|cyThQ
} K` 2i
explicit bit_iterator() : m_container(0) 16L"^EYq
{ |MVV +.X
m_size = 8*sizeof(Container); ig+k[`W
m_index = m_size; 2G H)iUmc
} :)j7U3u
bool operator* () |K6nOX!i
{ !#C)99L"F
char mask = 1; o16d`}/<
char* pc = (char*)m_container; T:Bzz)2/
int i = (m_size-m_index-1)/8; KoFv0~8Q
int off = (m_size-m_index-1)%8; ? 1GJa]G
mask <<=off; TX&[;jsj
return pc & mask; ~6] )*y
} $G)&J2zL
bit_iterator<Container>& operator++() 80 dSQ"y
{ QP'qG@j[:
m_index++; 9OH.&g
return *this; >}mNi:6xq
} dWMccn;-m
bit_iterator<Container>& operator++(int) 3F;EE:
{ [1e.i
m_index++; `Y0fst<,
return *this; xNn>+J
} gNG.l
bool operator==(bit_iterator<Container>& bitIt) .x]'eq}
{ mSy|&(l
return m_index == bitIt.m_index; 1xq3RD
} av"Dljc
bool operator!=(bit_iterator<Container>& bitIt) C-_(13S
{ *q+oeAYX
return !(*this == bitIt); Ct-rD79l
} {npOlV
protected:
hZ%2?v`
Container* m_container; JATS6-Lz`
private: .V7Y2!4TE
int m_size; Q=^ktKMeR
int m_index; 9fCiLlI
}; >xklt"*U,
suzFcLxo
用该迭代器可以将任意类型对象以二进制格式输出: ?56~yQF/2
double a = 10; |C^
c0
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));