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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top