0

我有一组 0 和 1,表示为最初使用 创建的列表sample(c(0,1), n, replace=TRUE),其中 n 是我的二进制数的长度。我目前正在使用 BCD 转换器将我的二进制数转换为十进制数,在这里可以看到:

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
}

我想改用 GrayCode.To.Decimal 转换器,它与我的 BCD.to.Decimal 转换器执行相同的工作,但改用格雷码。

注意:速度对此很重要,我想以最有效的方式做到这一点。我知道我的 BCD 转换器可能不是最有效的,它只是最简单的,如果您有一种更有效的方式来处理 BCD 转换,我也有兴趣了解这一点。

什么是格雷码?:http ://en.wikipedia.org/wiki/Gray_code

4

2 回答 2

1

好吧,在那个 Wiki 页面上有一个转换算法,尽管c你必须移植它。
再次在 wiki 页面上,有这个链接http://aggregate.org/MAGIC/#Gray%20Code%20Conversion 列出了许多转换算法,其中大部分看起来很容易编码。

顺便说一句,哦,无论如何: GA::grey2binary并且GA::binary2grey 已经存在。呸 :-)

ETA - 我很幸运通过 Mr.Google 找到了这个,但总的来说,这个包sos是一个很棒的 R 搜索工具。

于 2013-11-18T12:39:29.153 回答
0

这是我的问题的简单解决方案,该算法最终比最初出现的要容易得多。使用的算法可以在这里找到。

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))
}

此代码会将代码转换为二进制,然后您可以使用二进制转换将其转换为十进制数。我选择在评论部分使用 flodel 提供的代码。

Binary.to.Decimal <- function(binaryNumb)
{
  L = length(binaryNumb)
  sum(2L^(seq_along(binaryNumb)-1L) * rev(binaryNumb))
}
于 2013-11-29T03:03:51.567 回答