以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 @<sP1`1
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 J)[(4R>
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]-`{kX
象当作char数组来处理。 =f p(hX"
template<class Container> tw')2UGg
class bit_iterator : public std::iterator<bidirectional_iterator_tag, MdfkC6P
void, void> 6a!X`%N=
{ Zj0&/S
public: fjJIF%
explicit bit_iterator(Container& c) : m_container(&c) ?k?Hp:8?=
{ s`2o\]
m_size = 8*sizeof(Container); 87/{\h
m_index = 0; ZqGq%8\.s
} S9BJjo
explicit bit_iterator() : m_container(0) n(+:l'#HJ
{ pVY.&XBZ$
m_size = 8*sizeof(Container); 5VcYdu3
m_index = m_size; ']NM_0
} O#|E7;
bool operator* () &pAT
{ S {H8}m|MW
char mask = 1; w{qYP
char* pc = (char*)m_container; Vqr&)i"b$
int i = (m_size-m_index-1)/8; eyWwE%
int off = (m_size-m_index-1)%8; DQ}]'*@?
mask <<=off; iB`m!g6$
return pc & mask; oAx0$]+%V)
} WQ]pg
"
bit_iterator<Container>& operator++() N!3f1d7RQ
{ \3/9lE|gh
m_index++; Pg36'aTe%j
return *this; lo#,zd~
} IR&u55#I6
bit_iterator<Container>& operator++(int) PTh
Ya
{ s5dh]vNN
m_index++; Lsz`nD5
return *this; a`uT'g[*
} \CGcP
bool operator==(bit_iterator<Container>& bitIt) 1XKk~G"D
{ Sm,$~~iq}
return m_index == bitIt.m_index; xl^'U/
} ZjK~s)RC
bool operator!=(bit_iterator<Container>& bitIt) 90!Ib~7zH
{ Z-?9F`}
return !(*this == bitIt); 3PGyqt(
} (!(bysi9
protected: F*=RP$sj
Container* m_container; B+LNDnjO]
private: V_kE"W)
int m_size; sFTIRVXN,
int m_index; jj2UUQ|
}; 4Ojw&ys@V
U{Z>y?V/
用该迭代器可以将任意类型对象以二进制格式输出: ^J_hkw~gO
double a = 10; qr9F
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));