以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {^VvL'n
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 *R^u lp[W
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 {Jl W1;Jc7
象当作char数组来处理。 uM<6][^`
template<class Container> #D&]5"0cX
class bit_iterator : public std::iterator<bidirectional_iterator_tag, D#n^U
`\if
void, void> 1Q ^YaHzuW
{ ZNvnVW<
public: -] .Y";
explicit bit_iterator(Container& c) : m_container(&c) `+/xA\X]
{ Ge]2g0
m_size = 8*sizeof(Container); ;f7;U=gl,
m_index = 0; XABI2Ex
} >-{)wk;1&
explicit bit_iterator() : m_container(0) Z:PsQ~M
{ 9V=bV=4:
m_size = 8*sizeof(Container); j7)Xm,wI8
m_index = m_size; 2So7fZa^wg
} U ExK|t
bool operator* () dM1)wkbET
{ UldG0+1d
char mask = 1; /Ma"a
^
char* pc = (char*)m_container; oG )JH)!
int i = (m_size-m_index-1)/8; w3=Bj
int off = (m_size-m_index-1)%8; OO:^#Mvv5
mask <<=off; e)~7pXYV)
return pc & mask; t%n3~i4X:
} 0?",dTf3i
bit_iterator<Container>& operator++() wcT0XXh
{ jK^'s6i#
m_index++; =-c"~4
return *this; >}*iQq
} pGy(JvMw"
bit_iterator<Container>& operator++(int) u8Au `
{ idf~"a
m_index++; !v2D 18(
return *this; yH8
N 8
} : qKxm(
bool operator==(bit_iterator<Container>& bitIt) +Zx+DW cq
{ O&!tW^ih
return m_index == bitIt.m_index; U.
1Vpfy
} xrK%3nA4s"
bool operator!=(bit_iterator<Container>& bitIt) x-5XOqD{'
{ f-?00*T
return !(*this == bitIt); M<,E[2op
} D 5q Cn^R
protected: k@eU #c5c
Container* m_container; Cr,UP8MO
private: )hHkaI>eYv
int m_size; (N U*PQY6
int m_index; %:/_O*~)Yg
}; dE+xU(\,w
Syn>;FX
用该迭代器可以将任意类型对象以二进制格式输出: 9'I
I!
double a = 10; Uu9\;f
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));