以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 6D/tK|
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 S-!=NX&C
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 [l*;E
f,
象当作char数组来处理。 mU@xcN
template<class Container> R ]P;sk5
class bit_iterator : public std::iterator<bidirectional_iterator_tag, >1ZJ{se
void, void> ($>XIb9f
{ [s}/nu~U
public: 4pPI'd&/7
explicit bit_iterator(Container& c) : m_container(&c) e_rzA
{ !ni>\lZ
m_size = 8*sizeof(Container); ]JMl|e
m_index = 0; O('Nn]wo~9
}
10O$'`
explicit bit_iterator() : m_container(0) p3yU:q#A
{ 9$RIH\*
m_size = 8*sizeof(Container); ; )llt
G
m_index = m_size; +pp9d-n
} CVQB"L
bool operator* () C-w5KW
{ 8\#
^k#X
char mask = 1; hO( RZ'{
char* pc = (char*)m_container; H~o <AmE0!
int i = (m_size-m_index-1)/8; |"7Y52d
int off = (m_size-m_index-1)%8; .'d2J> ~N
mask <<=off; 3n48 %5
return pc & mask; }ZzLs/v%X
} /;oqf4MF
bit_iterator<Container>& operator++() u
#~;&D*q
{ 5<+KR.W
m_index++; K5k?H
return *this; h{_*oBa
} 0m)&YFZ[(
bit_iterator<Container>& operator++(int) 4l @)K9F
{ f$F*3
m_index++;
'Cc(3
return *this; d8OL!Rk
} LM"y\q ]
bool operator==(bit_iterator<Container>& bitIt) _^\$"nw
{ ][7p+IsB
return m_index == bitIt.m_index; F]_cbM{8/
} a$JLc a
bool operator!=(bit_iterator<Container>& bitIt) \ZH&LPAY
{ qZ X/@Yxz
return !(*this == bitIt); GwLFL.Ke
} &`Ck
protected: YRcps0Dx9
Container* m_container; 6rX_-Mm6w
private: s>%Pd7:
int m_size; T):SGW
int m_index; Uyx&E?SlEq
}; zp4W'8
FWY2s(5p
用该迭代器可以将任意类型对象以二进制格式输出: IIz0m3';+
double a = 10; }roG(
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));