2016-12-18 2 views
1

n-bit Gray codes을 반복하는 여러 가지 방법이 있습니다. 일부는 다른 것보다 효율적입니다. 그러나 실제로 그레이 코드가 필요하지 않으며 그레이 코드 목록에서 변경된 비트 인덱스를 반복하는 대신 실제 그레이 코드를 반복하는 것이 좋습니다. ,그레이 코드 변경 위치를 반복하는 효율적인 방법

000, 001, 011, 010, 110, 111, 101, 100

내가하려는 출력 3, 2, 3 : 예를 들어, 3 비트의 그레이 코드리스트를 가지고 1, 3, 2, 3. 이것은 우리가 목록을 얻기 위해 비트 3, 2, 3 등을 바꿀 필요가 있음을 말해 준다. 여기에서 1부터 왼쪽부터 색인을 생성합니다.

이 작업을 수행하는 한 가지 방법은 회색 코드를 순서대로 계산하고 각 연속 쌍 (x, y)에 대해 (xxOR y)를 계산하여 변경된 비트를 식별 한 다음 정수 로그베이스 2 (x XOR y).

그러나 가능한 한 빨리 반복해야하며 관심사는 30-40 비트 회색 코드입니다.

효율적인 방법이 있습니까?

+0

왜 코드 생성 자체가 비판적으로 효율적이어야하는지 궁금합니다. 내 이해를 위해, 열거 및 변경 위치 목록 생성 알고리즘 - 복잡도 (큰 - 오 - 표기법의 측면에서)는 열거 자체의 생성보다 크지 않습니다. 성능이 중요한 이유는 무엇입니까? – Codor

+0

@Codor 영구 (https://en.wikipedia.org/wiki/Computing_the_permanent)의 계산 속도를 높이기 위해 사용하고 있습니다. 일정한 요소의 속도 향상은 나에게 큰 도움이 될 것입니다. – eleanora

답변

2

0으로 시작하는 비트의 번호를 최하위로 지정하면 이진수로 그레이 코드를 증가시키기 위해 변경할 비트의 위치가 증가하는 이진수에 설정된 최하위 비트의 위치입니다 (위키피디아의 끝 부분 참조). 당신이 연결된 단락) - 제시 한 번호 매기기를 얻으려면 3/비트 위치 수를 뺍니다.

binary-reflected ("Gray") 000  001  011  010  110  111  101  100 
binary      001  010  011  100  101  110  111 
pos of least significant 1  0  1  0  2  0  1  0 
(count of trailing zeros ctz) 
3 - ctz(binary)    3  2  3  1  3  2  3 
+0

이것을 이해하려고합니다. 말 그대로 0에서 2^n-1까지 순서대로 반복 하시겠습니까? 그리고 각 값에 대해 가장 낮은 비트 세트의 위치를 ​​보시나요? 그럼 실제로 그레이 코드를 전혀 계산하지 않으셨습니까? 사실이라면 그렇게 간단합니다. – eleanora

+0

'말 그대로 0에서 2^n-1'까지 1, yes의 단계로 반복 하시겠습니까? '그럼 회색 코드를 전혀 계산하지 않으셨습니까? ' '그게 사실이라면 아주 간단 해 .' 마지막 두 문장을 이해하려고 노력하면서, [_n_ 비트 그레이 코드 만들기] (https://en.wikipedia.org/wiki/Gray_code#Constructing_an_n-bit_Gray_code)에서 위키피디아를 다시 보았습니까? 그 단락의, 특히? – greybeard

+0

필자는 그것을 오해하고 있어야합니다. 그러나 "i 단계> 0에서 i의 이진 표현에서 최하위 1의 비트 위치를 찾고 이전 코드의 해당 위치에서 비트를 뒤집어"라고 말합니다. " 또한 예제에서 "binary"라인에서 001부터 111까지 순차적으로 반복합니다. 마지막 줄은 두 번째 줄에서 후행 0의 개수를 보는 것처럼 보입니다. 당신의 예제에서 "binary-reflected"라인을 전혀 사용하지 않습니까? – eleanora

1

당신이 (당신은 확실히 당신이 벡터화 할 수 있도록 어셈블리 출력을 미세하게 제어 할 수있는 언어를 사용한다) C GCC의 내장으로, 예를 들어, 함께 작업하는 경우, 당신은

을 수행 할 수 있습니다
long long ctr = 0LL; 
int next() { return __builtin_ctzll(++ctr); } 

이 값은 카운터 ctr의 후미에있는 0을 계산하여 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, ...을 반환합니다.

필요한 경우 번역하십시오.

+0

__builtin_ctzll은 선행 0 수를 반환합니다. 우리는 또한 그레이 코드를 계산하고 질문에서와 같이 연속적인 그레이 코드 사이에서 XOR 연산을 수행해야합니까? 0을 나타내는 숫자를 계산하는 것으로 충분할 수 있음을 이해하지 못합니다. – eleanora

+2

'__builtin_ctzll처럼 보이는 것은 앞에 오는 0의 수를 반환합니다. _trailing_ (최하위에서부터 ** ** z는 _leading_입니다) : [GCC] (https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins .html) docs. – greybeard

+0

오, 알겠습니다 ... 당신의 대답은 그레이비드와 함께합니다. – eleanora