문제
처음에 생성된 목록으로 표현되는 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
}
대신 BCD.to.Decimal 변환기와 동일한 작업을 수행하지만 대신 Gray Code를 사용하는 GrayCode.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))
}
.
이 코드는 코드를 바이너리로 변환 한 다음 이진 변환을 사용하여 10 진수로 변환합니다.나는 코멘트 섹션의 FLODEL이 제공 한 코드를 선택하고 있습니다.
Binary.to.Decimal <- function(binaryNumb)
{
L = length(binaryNumb)
sum(2L^(seq_along(binaryNumb)-1L) * rev(binaryNumb))
}
. 다른 팁
음, 해당 Wiki 페이지에는 변환 알고리즘이 있습니다. c
그래서 당신은 그것을 이식해야합니다.
다시 Wiki 페이지에 이 링크가 있습니다. http://aggregate.org/MAGIC/#Gray%20Code%20Conversion여기에는 여러 가지 변환 알고리즘이 나열되어 있으며 대부분은 코드 작성이 매우 간단해 보입니다.
그런데, 아 뭐든간에: GA::grey2binary
그리고 GA::binary2grey
이미 존재합니다.바하 :-)
도착 예정 시간 - 운이 좋게도 Mr.Google을 통해 이 항목을 찾을 수 있었지만 일반적으로 패키지는 sos
훌륭한 R-검색 도구입니다.