Skip to content

Instantly share code, notes, and snippets.

@sandroqz
Created November 30, 2016 13:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sandroqz/ae75f052ac3cfae0b1f0a161dc4b1111 to your computer and use it in GitHub Desktop.
Save sandroqz/ae75f052ac3cfae0b1f0a161dc4b1111 to your computer and use it in GitHub Desktop.
#require 'pry'
def quantidade_bits_verificacao (m)
k = 0
while (2 ** k) - 1 < m + k
k += 1
end
k
end
def calcula_bits_verificacao (bits_dados)
m = bits_dados.size
k = quantidade_bits_verificacao(m)
for i in 0..k-1
bits_dados.insert((2**i) * -1, "c#{2**i}")
end
bits_verificacao = []
for i in 1..k
x = bits_dados.size
y = []
bits_dados.each_with_index { |val, index|
if ((x - index).to_s(2)[-i] == "1")
y.push(val)
end
}
if(y.count(1) % 2 == 0)
bits_verificacao.unshift(0)
else
bits_verificacao.unshift(1)
end
end
bits_verificacao
end
puts "Digite a palavra binária para ser armazenada: "
palavra_armazenada = gets.strip.split('').map(&:to_i)
bv_palavra_armazenada = calcula_bits_verificacao (palavra_armazenada)
puts "Digite a palavra binária para ser pesquisada: "
palavra_pesquisada = gets.strip.split('').map(&:to_i)
bv_palavra_pesquisada = calcula_bits_verificacao (palavra_pesquisada)
x1 = bv_palavra_armazenada.join("") #0111
x2 = bv_palavra_pesquisada.join("") #0001
palavra_sindrome = (x1.to_i(2) ^ x2.to_i(2)).to_s(2) #0110
posicao_bit_palavra_com_erro = palavra_sindrome.to_i(2)
posicao_bit_dado_com_erro = 0
for i in 0..palavra_sindrome.to_i(2)-1
posicao_bit_dado_com_erro += 1 if palavra_armazenada.reverse[i].instance_of? String
end
posicao_bit_dado_com_erro = posicao_bit_palavra_com_erro - posicao_bit_dado_com_erro
if (palavra_sindrome.count("1") == 0)
puts "Nenhum erro foi detectado!!!"
elsif (palavra_sindrome.count("1") == 1)
puts "Ocorreu um erro em um dos bits de verificação. Nenhuma ação é necessária!"
else
puts "ERRO encontrado na posição de bit: #{posicao_bit_palavra_com_erro}. Que contém o bit de dado: #{posicao_bit_dado_com_erro}"
end
#binding.pry
#puts "fim"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment