Converter código Gray em decimal em R
Pergunta
Eu tenho um conjunto de 0 e 1 representado como uma lista criada inicialmente com sample(c(0,1), n, replace=TRUE)
, onde n é o comprimento do meu número binário.Atualmente estou usando um conversor BCD para converter meu número binário em um número decimal, isso é visto aqui:
BCD.to.Decimal <- function(binaryNumb)
{
binaryLength = length(binaryNumb)
decimalNumb = 0
for(i in 1:binaryLength)
{
if ( binaryNumb[i] == 1)
decimalNumb = decimalNumb + 2^(binaryLength - i)
}
decimalNumb
}
Em vez disso, gostaria de usar um conversor GrayCode.To.Decimal que faz o mesmo trabalho que meu conversor BCD.to.Decimal, mas usando Gray Code.
Observação:A velocidade é importante para isso, e eu gostaria de fazer isso da maneira mais eficiente possível.Estou ciente de que meu conversor BCD provavelmente não é o mais eficiente, é apenas o mais simples. Se você tiver uma maneira significativamente mais eficiente de lidar com a conversão BCD, também estaria interessado em ouvir sobre isso.
O que é o Código Gray?: http://en.wikipedia.org/wiki/Gray_code
Solução 2
Aqui está a solução simples para minha dúvida, o algoritmo acabou sendo muito mais fácil do que parecia.O algoritmo usado pode ser encontrado aqui.
GrayCode.to.Decimal <- function(grayNumb)
{
binaryNumb = vector("numeric",length(grayNumb))
binaryNumb[1] = grayNumb[1]
for (i in 2:length(grayNumb))
{
binaryNumb[i] = xor(grayNumb[i], binaryNumb[i - 1])
}
return(Binary.to.Decimal(binaryNumb))
}
Este código converterá o código em binário, onde você poderá usar uma conversão binária para convertê-lo em um número decimal.Estou optando por usar o código fornecido pelo flodel na seção de comentários.
Binary.to.Decimal <- function(binaryNumb)
{
L = length(binaryNumb)
sum(2L^(seq_along(binaryNumb)-1L) * rev(binaryNumb))
}
Outras dicas
Bem, há um algoritmo de conversão nessa página Wiki, embora em c
então você terá que portá-lo.
Novamente na página wiki, há este link http://gregate.org/MAGIC/#Gray%20Code%20Conversionque lista vários algoritmos de conversão, muitos dos quais parecem bastante simples de codificar.
A propósito, ah, tanto faz: GA::grey2binary
e GA::binary2grey
já existe.bah :-)
ETA - Tive a sorte de encontrar isso através do Sr.Google, mas em geral o pacote sos
é uma ótima ferramenta de pesquisa R.