题
我有一组 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 转换,我也有兴趣了解一下。
解决方案 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::grey2binary
和 GA::binary2grey
已经存在。呸:-)
ETA - 我很幸运通过 Mr.Google 找到了这个,但总的来说,包裹 sos
是一个很棒的 R 搜索工具。
不隶属于 StackOverflow