以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 g>].m8DZ'
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 6jS:_[p
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 2L?jp:$;X
象当作char数组来处理。 }_,1i3Rip
template<class Container> W%$sA}O
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Q[sj/
void, void> i
b$2qy
{ |KH9 81
public: }C6RgE.6<
explicit bit_iterator(Container& c) : m_container(&c) ]nmVT~lBe"
{ H$G`e'`OZ
m_size = 8*sizeof(Container); N`o[iHUj \
m_index = 0; V+04X"
} {DfXn1Cg0U
explicit bit_iterator() : m_container(0) FZdZGK
{ CG!7BP\
m_size = 8*sizeof(Container); '8RBR%)y
m_index = m_size; d#l z^Ls2
} Ky:y1\K1^K
bool operator* () mQ~0cwo)
{ =]Gw9sge@
char mask = 1;
*SP@`)\D
char* pc = (char*)m_container; 6d%V=1^F
int i = (m_size-m_index-1)/8; Eu;f~ V
int off = (m_size-m_index-1)%8; Tw`n 3y?
mask <<=off; O4Z_v%2M
return pc & mask; FR5P;Yz%H
} R# 8.]
bit_iterator<Container>& operator++() ~6bf-Wg'X
{ >v\t>
[9t
m_index++; g$CWGB*%lm
return *this; TDqH"q0
} )7`2FLG
bit_iterator<Container>& operator++(int) a8Va3Y
{ o'#ow(X
m_index++; A.[~}ywH
return *this; eW"L")
} S8_>Lw
bool operator==(bit_iterator<Container>& bitIt) ^ "
{ ] x12_+
return m_index == bitIt.m_index; ;^yR,32F
} 4 C7z6VWg
bool operator!=(bit_iterator<Container>& bitIt) LN!e_b
{ n\/ JNzd3
return !(*this == bitIt); o$4xinK
} )P|&o%E
protected: tV'>9YVdG
Container* m_container; *{K?JB#W
private: A3su!I2S
int m_size; *PSUB{i(
int m_index; _zuX6DO
}; =eHoJq
V DN@=/
用该迭代器可以将任意类型对象以二进制格式输出: Gt|m;o
double a = 10; OQ=0>;>
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));