以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 lqKwjJtX
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 v=H!Y";
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]j(Ld\:L
象当作char数组来处理。 *8 ]
template<class Container> :wJ!rn,4
class bit_iterator : public std::iterator<bidirectional_iterator_tag, cH7D@p}
void, void> C%'eF`
{ BimM)4g
public: _j<,qi
explicit bit_iterator(Container& c) : m_container(&c) BCHI@a
{ Rh7=,=u
m_size = 8*sizeof(Container); >2)!w
m_index = 0; I3?:KVa
} Os1y8ui
explicit bit_iterator() : m_container(0) !i6 aA1'
{ $Vm J[EF1
m_size = 8*sizeof(Container); \y/+H
m_index = m_size; <lLk(fC
} k_Edug~B
bool operator* () NO)vk+
{ o6
[i0S
char mask = 1; yM34G S=,J
char* pc = (char*)m_container; '?!2h'
int i = (m_size-m_index-1)/8; bRAf!<3
int off = (m_size-m_index-1)%8; k?=V?JWY
mask <<=off; JGk,u6K7
return pc & mask; mH3{<^Z6
} #D!3a%u0
bit_iterator<Container>& operator++() k4nA+k<WI`
{ iAWoKW
m_index++; 6UJBE<ntj
return *this; e 3>k"
} 5(OF~mX#
bit_iterator<Container>& operator++(int) ~LzTqMHM
{ ?jzadC el
m_index++; gM3gc;
return *this; w@2LFDp
} Jh:-<xy)
bool operator==(bit_iterator<Container>& bitIt) 5*>3(U
{ N:/$N@"Ge
return m_index == bitIt.m_index; ) uyh
} <`m.Vbvm"
bool operator!=(bit_iterator<Container>& bitIt) 'C*NyHc
{ ByZ.!~
return !(*this == bitIt); 4B}w;d@R
} 9uREbip
protected: >Y< y]vM:
Container* m_container; E]Hl&t/}
private: f1>^kl3@P
int m_size; g^En6n)
int m_index; ,K6]Q|U@r
}; Y<.F/iaH
9tC8|~Q
用该迭代器可以将任意类型对象以二进制格式输出: z:R2Wksg
double a = 10; Xc5[d`]
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));