以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 R%Yws2Le2
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 |7I.DBjR;
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 A4?_0:<
象当作char数组来处理。 \(LHcvbb
template<class Container> WiL~b
=fT
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !m1pL0
void, void> U9xFQ=$2
{ AsM""x1Ix
public: n6nwda
explicit bit_iterator(Container& c) : m_container(&c) *R>I%?]V3
{ +*
)Qi)
m_size = 8*sizeof(Container); "FaG5X(
m_index = 0;
)[)-.{q
} $/45*
explicit bit_iterator() : m_container(0) q#PGcCtu
{ 6|LDb"Rvy
m_size = 8*sizeof(Container); -zz9k=q
m_index = m_size; N[ArwV2O
} R< xxwjt
bool operator* () {\ziy4<II
{ a@,tf'Sr
char mask = 1; Y@u{73H
char* pc = (char*)m_container; gpr];lgS
int i = (m_size-m_index-1)/8; mXF
pGo5 s
int off = (m_size-m_index-1)%8; bTHa;* `
mask <<=off; Z/uRz]Hi
return pc & mask; O,JthlAV4
} jO:<"l^+u
bit_iterator<Container>& operator++() ZLKS4
{ 9LJ/m\bi
m_index++; ^"+cJ)
return *this; cX.v^9kuX
} Punbw\9!d,
bit_iterator<Container>& operator++(int) ^Z:x poz,
{ 6nGDoW#
m_index++; b<.+WkO
return *this; L1C'V/g
} 9f l !CG
bool operator==(bit_iterator<Container>& bitIt) 7P|(j<JX6'
{ (%+DE4?
return m_index == bitIt.m_index; cS ];?tqrA
} <O\z`aA'q
bool operator!=(bit_iterator<Container>& bitIt) `&9#!T.
{ ~Nc]`95
return !(*this == bitIt); -U/&3
} ,CM$A}7[
protected: g\*gHHa
Container* m_container; Va*Uwy?x/)
private: LK:|~UV?
int m_size; Gh{k ~/B
int m_index; DD3J2J
}; @#Xzk?+
":-)mfgGU
用该迭代器可以将任意类型对象以二进制格式输出: ~C!vfPC
double a = 10; %] #;
~I%
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));