以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 8P0XY
S@
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Ey=(B'A~
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 aR ao\Wp|
象当作char数组来处理。 p#)u2^
template<class Container> V|ax(tHv
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 2cr~/,YY
void, void> ^[Cpu_]D
{ R_:47.qq
public: a33}CVG-e3
explicit bit_iterator(Container& c) : m_container(&c) ',?v7&
{ 2?58=i%b
m_size = 8*sizeof(Container); tzJdUZJ
m_index = 0; \,i9 m9;y
} aG}ju;
explicit bit_iterator() : m_container(0) : I28Zi*
{ ao#{N=mn
m_size = 8*sizeof(Container); s\,F6c
m_index = m_size; qP6]}Aj]
} :TqvL'9o
bool operator* () j{SRE1tqh
{ {$)zC*l
char mask = 1; r5> FU>7'
char* pc = (char*)m_container; _?kjIF
int i = (m_size-m_index-1)/8; p<*3mbgGO
int off = (m_size-m_index-1)%8; +',[q
mask <<=off; E8zga )
return pc & mask; /UTeaM!?"
} ;3OQgKI
bit_iterator<Container>& operator++() YwyP+Sr\
{ ~UX@%0%)N
m_index++; 0m$f9b|Q?
return *this; ^AdHP!I
} O%;H#3kn&s
bit_iterator<Container>& operator++(int) %eB 0)'
{ y{+$B
Y$_
m_index++; S:4'k^E
return *this; ,3&XV%1
} X@|'#%
bool operator==(bit_iterator<Container>& bitIt) 2%i_SX[
{ G=/a>{
return m_index == bitIt.m_index; a7s+l=
} C']TO/2q
bool operator!=(bit_iterator<Container>& bitIt) x7)j?2
{ <|[G=GA\S!
return !(*this == bitIt); 5drc8_fZ
} @H2c77%
protected: DW&%"$2
Container* m_container; CRf !tsj@
private: F]DRT6)
int m_size; W~(@*H
int m_index; 7Vd"k;:X
}; Rd@34"O
kIhP 73M
用该迭代器可以将任意类型对象以二进制格式输出: A5cx!h
double a = 10; NFw7g&1;Kp
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));