How to understand this expression?
Question:
I am converting Hamming code from python to kotlin. And I almost did everything, but there is one expression that I do not understand.
error=sum(int(parity_list) * (2 ** i) for i, parity_list in enumerate(parity_list[::-1]))
For example: I enter the number 101
The value of the variables are obtained:
parity_list = [1,0]
i = 5
error = 2
How come error = 2
? Can you explain the execution sequence with an example?
Program code:
# coding=windows-1251
from traceback import print_tb
print('Введите полученный код Хэмминга')
d=input()
data=list(d)
data.reverse()
c,ch,j,r,error,h,parity_list,h_copy=0,0,0,0,0,[],[],[]
for k in range(0,len(data)):
p=(2**c)
h.append(int(data[k]))
h_copy.append(data[k])
if(p==(k+1)):
c=c+1
for parity in range(0,(len(h))):
ph=(2**ch)
if(ph==(parity+1)):
startIndex=ph-1
i=startIndex
toXor=[]
while(i<len(h)):
block=h[i:i+ph]
toXor.extend(block)
i+=2*ph
for z in range(1,len(toXor)):
h[startIndex]=h[startIndex]^toXor[z]
parity_list.append(h[parity])
ch+=1
parity_list.reverse()
print('parity_list = ', parity_list)
print('parity_list = ', parity_list[::-1])
print('i = ', i)
error=sum(int(parity_list) * (2 ** i) for i, parity_list in enumerate(parity_list[::-1]))
print("error = ", error)
if((error)==0):
print('В полученном коде Хэмминга нет ошибок')
elif((error)>=len(h_copy)):
print('Ошибка не может быть обнаружена')
else:
print('Error is in',error,'bit')
if(h_copy[error-1]=='0'):
h_copy[error-1]='1'
elif(h_copy[error-1]=='1'):
h_copy[error-1]='0'
print('После исправления код Хэмминга: - ')
h_copy.reverse()
print(int(''.join(map(str, h_copy))))
I understand how the function for i, parity_list in enumerate(parity_list[::-1])
works, but how to add this int(parity_list) * (2 ** i)
?
Answers:
# Define the list
parity_list = [1, 0];
# reverse the list
reveresed_parity_list = parity_list[::-1]
# define error output as 0
error = 0
# loop through each element, getting the index and the value where i is the index and parity_list_value is the value
for i, parity_list_value in enumerate(reveresed_parity_list):
# if i = 0 then 2^0 = 1 as the rule for any value to the exponent of 0
error += int(parity_list_value) * (2 ** i)
I am converting Hamming code from python to kotlin. And I almost did everything, but there is one expression that I do not understand.
error=sum(int(parity_list) * (2 ** i) for i, parity_list in enumerate(parity_list[::-1]))
For example: I enter the number 101
The value of the variables are obtained:
parity_list = [1,0]
i = 5
error = 2
How come error = 2
? Can you explain the execution sequence with an example?
Program code:
# coding=windows-1251
from traceback import print_tb
print('Введите полученный код Хэмминга')
d=input()
data=list(d)
data.reverse()
c,ch,j,r,error,h,parity_list,h_copy=0,0,0,0,0,[],[],[]
for k in range(0,len(data)):
p=(2**c)
h.append(int(data[k]))
h_copy.append(data[k])
if(p==(k+1)):
c=c+1
for parity in range(0,(len(h))):
ph=(2**ch)
if(ph==(parity+1)):
startIndex=ph-1
i=startIndex
toXor=[]
while(i<len(h)):
block=h[i:i+ph]
toXor.extend(block)
i+=2*ph
for z in range(1,len(toXor)):
h[startIndex]=h[startIndex]^toXor[z]
parity_list.append(h[parity])
ch+=1
parity_list.reverse()
print('parity_list = ', parity_list)
print('parity_list = ', parity_list[::-1])
print('i = ', i)
error=sum(int(parity_list) * (2 ** i) for i, parity_list in enumerate(parity_list[::-1]))
print("error = ", error)
if((error)==0):
print('В полученном коде Хэмминга нет ошибок')
elif((error)>=len(h_copy)):
print('Ошибка не может быть обнаружена')
else:
print('Error is in',error,'bit')
if(h_copy[error-1]=='0'):
h_copy[error-1]='1'
elif(h_copy[error-1]=='1'):
h_copy[error-1]='0'
print('После исправления код Хэмминга: - ')
h_copy.reverse()
print(int(''.join(map(str, h_copy))))
I understand how the function for i, parity_list in enumerate(parity_list[::-1])
works, but how to add this int(parity_list) * (2 ** i)
?
# Define the list
parity_list = [1, 0];
# reverse the list
reveresed_parity_list = parity_list[::-1]
# define error output as 0
error = 0
# loop through each element, getting the index and the value where i is the index and parity_list_value is the value
for i, parity_list_value in enumerate(reveresed_parity_list):
# if i = 0 then 2^0 = 1 as the rule for any value to the exponent of 0
error += int(parity_list_value) * (2 ** i)