Преобразовать код Грея в десятичный в R
Вопрос
У меня есть набор 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::grey2binary
и GA::binary2grey
уже существует.ба :-)
ETA - мне посчастливилось найти это через Mr.Google но в целом посылка sos
— отличный инструмент R-поиска.