以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 E\U6n ""]
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 EYc, "'
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对
x Bn+-V
象当作char数组来处理。 Qz*!jwg
template<class Container> H ]BH
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Yh%a7K
void, void> \k?uh+xl
{ wRwTN"Yg
public: y#\jc4F_a
explicit bit_iterator(Container& c) : m_container(&c) _C`cO
{ F<8Rr#Z
m_size = 8*sizeof(Container); Ax[!7~s
m_index = 0; 1i;-mYGaMn
} i?R+Ul`Q
explicit bit_iterator() : m_container(0) xpo<1Sr>S
{ $+` YP
m_size = 8*sizeof(Container); RhM]OJd'
m_index = m_size; !mFx= +
} imcq
H
bool operator* () v?b9TE
{ ,o(7z^1Pe;
char mask = 1; kz]vXJ
char* pc = (char*)m_container; 0i}4T:J@`
int i = (m_size-m_index-1)/8; hX#s3)87
int off = (m_size-m_index-1)%8; J)O1)fR
mask <<=off; 3eUTV<!
return pc & mask; _D9`L&X}
} ^4@~\#$z
bit_iterator<Container>& operator++() vywd&7gK
{ Do@:|n
m_index++; SJY<#_b
return *this; R["2kEF
} 5m,{?M`
bit_iterator<Container>& operator++(int) )zK`*Fa
az
{ neW_mu;~Z
m_index++; 8y;W+I(71
return *this; <1tFwC|4BJ
} *hI
bool operator==(bit_iterator<Container>& bitIt) =j[zMO
{ ZM oV!lu
return m_index == bitIt.m_index; H"PnX-fGN
} m=&j2~<i
bool operator!=(bit_iterator<Container>& bitIt) ODn6%fp%
{ &Mz3CC6
return !(*this == bitIt); y7#$:+jQv
} zNT~-
protected: y(&JE^GfX
Container* m_container; V>}@--$c-r
private: ]PVPt,c
int m_size; k|W =kt$ P
int m_index; 'LZF^m _<<
}; b#h?O}
@vWC "W
用该迭代器可以将任意类型对象以二进制格式输出: Ui6f>0?
double a = 10; (uG.s %I
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));