Skip to content

Commit b78c033

Browse files
committed
Add HammingCode.py
1 parent fd8d8f0 commit b78c033

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

Hamming_Code/Python/HammingCode.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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 '\nThe Hamming encoded word for',i,'is : ',
62+
ComputeHamming(data)
63+
i+=1
64+
65+
if __name__ == '__main__':
66+
main()

0 commit comments

Comments
 (0)