2017-11-15 10 views
1

Minimax-Algorithm I 코드의 경우 비트 연산을 실험하여 속도를 높이고 싶습니다. 각 gamestate는 UInt128로 저장되며 4x4 타일 기반 보드를 설명합니다. 각 타일은 0 ~ 32 (배타적)의 값을 가질 수 있으므로 타일 당 5 비트입니다.2 차원 비트 배열에서 비트 추출

+-------+-------+-------+-------+ 
| 0-4 | 5-9 | 10-14 | 15-19 | 
+-------+-------+-------+-------+ 
| 20-24 | 25-29 | 30-34 | 35-39 | 
+-------+-------+-------+-------+ 
| 40-44 | 45-49 | 50-54 | 55-59 | 
+-------+-------+-------+-------+ 
| 60-64 | 65-69 | 70-74 | 75-79 | 
+-------+-------+-------+-------+ 

실제로 보드에서 연산을 수행하려면 3x3의 중심을 기준으로 4x4에서 3x3 블록을 추출해야합니다. 나는 어떻게 그것에 대해 갈 것인가? 비트 쉬프트를 통해 모든 셀을 수동으로 처리하면 아무런 문제가 발생하지 않지만 더 빠른 방법이 있는지 궁금합니다.

미리 감사드립니다.

(문제가되는 경우 언어는 C#입니다)

답변

1

비트 연산 속도가 빠릅니다. 비트 시프 팅을 사용하여 수동으로 문제를 해결할 수 있으므로 4x4 사본을 만들어 3x3으로 줄인 다음 작업을 수행하고 성능 문제가 있는지 확인하십시오.

'작업'을 수행하는 것이 읽기 전용을 의미하는 경우 4x4에서 비트에 직접 액세스하는 비용, 복사, 이동 및 여전히 3x3에 액세스해야하는 비용에 따라 추가 사본이 더 비싸다고 증명 될 수 있습니다.

참고로 128 비트 유형을 사용 중이므로 바이트 [16] (또는 3x3 연산에 바이트 [9])를 사용할 수 있습니다. 이렇게하면 개별 셀에 액세스하는 것이 더 빠릅니다.

+0

awnser에게 감사드립니다. 바이트 배열을 복사 할 때 바이트 배열이 꽤 비싸지 않습니까? (구조체 내부에서 사용) –

+0

그건 내가보기에 제안한 것입니다. 저의 요점은 하나의 128 비트 어레이를 다른 것으로 추출하는 것보다 비용이들 것이므로 비트 마스크 (계산 위치 등)를 읽고/쓰는 것입니다. 두 개의 구조체 (아마도 UInt128은 무엇입니까?), 16 바이트 변수 Cell1-16 (System.Numerics.Matrix4x4와 유사) 및 Cell1-9와 다른 구조체를 만들 수 있습니다. 이들이 이제 ValueType (참조 유형 인 바이트 배열과 반대 됨)이기 때문에 UInt128처럼 복사됩니다. – Rob