以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 /PAxPZf_
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 rm NqS+t
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Q9Wa@gi|
象当作char数组来处理。 37Z:WJ?
template<class Container> DQd~!21\|
class bit_iterator : public std::iterator<bidirectional_iterator_tag,
'@9h@,tc
void, void> UfSWdR)
{ 'QjX2ytgX
public: M&
GA:`
explicit bit_iterator(Container& c) : m_container(&c) |Z<NM#1
{ CEE`nn
m_size = 8*sizeof(Container); Tz1St{s\
m_index = 0; 1_THBL26d
} !j6]k^ra
explicit bit_iterator() : m_container(0) JGp~A#H&
{ _H|x6X1-
m_size = 8*sizeof(Container); C+$dm)M/q
m_index = m_size; `(<XdlOj
} Nrva?W_i
bool operator* () (t1:2WY@
{ a5:Q%F<!
char mask = 1; <XX\4[wb
char* pc = (char*)m_container;
SEF/D0
int i = (m_size-m_index-1)/8; Y(ly0U}
int off = (m_size-m_index-1)%8;
DHJh.Y@H
mask <<=off; \aQBzEX
return pc & mask; p
mcy(<
} cOthq87:
bit_iterator<Container>& operator++() B5aFt ;Vj
{ ZkkXITQkPM
m_index++; "d>{hP
return *this; z,[4BM
} (Kd;l&8
bit_iterator<Container>& operator++(int) [s"3g\L';
{ abUvU26t
m_index++; :f?\ mVS+
return *this; v{^_3
]
} 7^#f<m;Ar!
bool operator==(bit_iterator<Container>& bitIt) /Ou`$2H87
{ Ey=(B'A~
return m_index == bitIt.m_index; e'mm4 2
} Tk9u+;=6$
bool operator!=(bit_iterator<Container>& bitIt)
cHs@1R/-s
{ 9%j_"+<c
return !(*this == bitIt); W)ihk\E
} >_(Xb%w
protected: %*lOzC
Container* m_container; -bu.Ar-#;h
private: qP6]}Aj]
int m_size; Wc ]BQn
int m_index; uA7~`78
}; EFu2&P
rlmzbIuI9
用该迭代器可以将任意类型对象以二进制格式输出: A&rk5y;
double a = 10; Uc%(#I]Mi
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));