File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ import math
2+
3+ def FindKeyBits (n ):
4+ keyBits = []
5+ pad = int (math .ceil (math .log (n )/ math .log (2 )))
6+ for i in xrange (1 , n + 1 ):
7+ b = "{0:b}" .format (i )
8+ b = b .zfill (pad )
9+ keyBits .append (b )
10+ return keyBits
11+
12+ def IsPowerOf2 (x ):
13+ return ((x & (x - 1 ))== 0 )
14+
15+ def XOR (a , b ):
16+ return str (int (a )^ int (b ))
17+
18+ def FindParityCount (m ):
19+ r = math .ceil ((math .log (m )/ math .log (2 ))+ 1 )
20+ return int (r )
21+
22+ def CalculateParity (keyBits , data , parityTrack ):
23+ parity = '0'
24+ pbCount = 0
25+ for elem in keyBits :
26+ if not IsPowerOf2 (int (elem ,2 )):
27+ if elem [- parityTrack ]== '1' :
28+ parity = XOR (parity , data [pbCount - int (elem ,2 )])
29+ else :
30+ pbCount += 1
31+ return parity
32+
33+ def ComputeHamming (data ):
34+ dataLen = len (data )
35+ parityCount = FindParityCount (dataLen )
36+ hammingLen = dataLen + parityCount
37+ keyBits = FindKeyBits (hammingLen )
38+ hammingCode = []
39+ dataTrack = - 1
40+ parityTrack = 1
41+ for i in xrange (1 , hammingLen + 1 ):
42+ if IsPowerOf2 (i ):
43+ parity = CalculateParity (keyBits , data , parityTrack )
44+ hammingCode .append (parity )
45+ parityTrack += 1
46+ else :
47+ hammingCode .append (data [dataTrack ])
48+ dataTrack -= 1
49+ hammingCode .reverse ()
50+ for i in hammingCode :
51+ print i ,
52+
53+
54+ def main ():
55+ print '\n '
56+ inputList = []
57+ for i in xrange (int (raw_input ())):
58+ inputList .append (raw_input ())
59+ i = 1
60+ for data in inputList :
61+ print '\n The Hamming encoded word for' ,i ,'is : ' ,
62+ ComputeHamming (data )
63+ i += 1
64+
65+ if __name__ == '__main__' :
66+ main ()
You can’t perform that action at this time.
0 commit comments