以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 z$A5p4=B'^
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 NH/H+7,o
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 oc.x1<Nd
象当作char数组来处理。 dc *#?G6^
template<class Container> UNJ|J$T]
class bit_iterator : public std::iterator<bidirectional_iterator_tag, <?eZ9eB
void, void> 4*]`s|fbu
{ ;lldxS
public: >:Ec
explicit bit_iterator(Container& c) : m_container(&c) -J:vYhq|g
{ &o(?
}W
m_size = 8*sizeof(Container); %3cBhv[q4
m_index = 0; gi8kYHldH
} }-kb"\X%g
explicit bit_iterator() : m_container(0) SVJ3!1B,
{ *|cvx:GO
m_size = 8*sizeof(Container); pn)5neX{
m_index = m_size; Sc(2c.HO*
} u:k#1Nn!
bool operator* () Vs(;al'
{ yl*S|= 8;k
char mask = 1; U i;o/Z3
char* pc = (char*)m_container; 6Dch+*4*@
int i = (m_size-m_index-1)/8; >13= 4S
int off = (m_size-m_index-1)%8; }
?
mask <<=off; :98Pe6
return pc & mask; >2$M~to"1
} _\"?:~rUN
bit_iterator<Container>& operator++() k0,~wn\#h
{ !Bd2$y.
m_index++; ^#%[
return *this; +r '
} \J6T:jeS,
bit_iterator<Container>& operator++(int) X~x]VKr/
{ WWY9U
m_index++; F4@h}T5)
return *this; ][9M_.
} nt4> 9;
bool operator==(bit_iterator<Container>& bitIt) +IU]=qS
{ (mycUU%
return m_index == bitIt.m_index; RNPqW,B!0
} R8axdV9(
bool operator!=(bit_iterator<Container>& bitIt) q\ ?6-?Mr
{ GXwV>)!x
return !(*this == bitIt); 3Vhm$y%Td
} joa$Y6
protected: 5(,WN
Container* m_container; #3.\}d)
private: 1m&(3%#{
int m_size; 4Hu.o 7
int m_index; ?qdG)jo=
}; 1iz\8R:0
U*zjEY:A
用该迭代器可以将任意类型对象以二进制格式输出: (FBKP#x)^
double a = 10; 7Y_S%B:F
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));