【问题标题】:Convert Gray Code to Decimal in R在R中将格雷码转换为十进制
【发布时间】:2013-11-18 00:42:51
【问题描述】:

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

【问题讨论】:

  • 关于让你的 BCD 更快:function(x) sum(2L^(seq_along(x)-1L) * rev(x))
  • 关于现有函数的重要一点:它将二进制转换为十进制,不是 BCD en.wikipedia.org/wiki/BCD_(6-bit)。还有一个基本函数strtoi 用于将二进制转换为十进制。
  • 谢谢@Carl,我不知道它们之间的区别。很高兴知道我一直在交替使用 BCD 和“二进制转换”,这显然是错误的。我现在看到了区别。

标签: r gray-code


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    Binary.to.Decimal <- function(binaryNumb)
    {
      L = length(binaryNumb)
      sum(2L^(seq_along(binaryNumb)-1L) * rev(binaryNumb))
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 2016-10-06
      • 2013-10-30
      • 2017-10-15
      • 2011-07-05
      • 1970-01-01
      • 2021-06-17
      • 2017-12-27
      • 2016-03-05
      相关资源
      最近更新 更多