我有一组 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

有帮助吗?

解决方案 2

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

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top