2013-05-23 1 views
0
int a[10]; 
int b[10]; 
memcmp(a, b, sizeof(int) * 10); 

memcmp()은 그냥 -1,0, + 1을 반환하기 때문에 작은/큰되는 메모리 블록을 우리에게 알려줍니다 일치하는 바이트 수를 얻기 위해 배열을 비교합니다. 일치하는 요소의 수를 a[]b[]에 알맞게 알 수있는 방법이 있으며 그 후에 불일치가 발생합니다.는 MEM은

Ex: a = {1, 2, 3, 4, 5, 6} 
    b = {1, 2, 4} 

여기서 memcmp(a, b, sizeof(int)* 3)은 -1을 반환합니다. 대답 우리가 memcmp의 도움이나 이와 유사한 붙박이 기능

+4

for-loop는 충분히 단순해야하며 이에 대한 기본 제공 기능을 알지 못합니다. – Dukeling

+1

질문에 일반적으로 언어 태그가 필요합니다. C 태그가 추가되었습니다. 적절한 경우 C++로 * 변경 *하십시오. – Dukeling

답변

2

와 일치하는 요소의 수를 얻을 수있는 방법 나는 당신이해야하기 때문에 이미와 쉬운 방법을 거부하면 낮은 수준의 대답을 원하는 가정이있는 한 나는 2 싶어 루프.

b [0]에서 b [9]까지 a [0]에서 a [9]로 XOR 할 수 있습니다. 원본 배열이 동등한 경우에만 결과 블록이 0 블록이됩니다. 일치하는 요소의 수를 얻으려면 모든 제로 비트를 가진 int 블록의 수를 계산하십시오.

어셈블러에서 작업을 매우 간단하게 수행 할 수 있습니다.

+1

그리고 루프를 사용하지 않고 정확히 한 메모리 블록을 다른 메모리 블록과 XOR합니까? XOR과'=='사이에는 명백한 성능 이점이 없습니다. 실제로 '=='는 아마도 어셈블러 레벨의 루프에 체크가 통합 될 수 있기 때문에 더 빠를 것입니다 : "if if equal". – Lundin

+0

Z80 칩에서 스프라이트 그래픽을 사용하는 것은 당연한 일입니다. 우리 모두 알고 있듯이 칩 아키텍처에 의존 할 것입니다. – Bathsheba

+0

Lundin 나는 확실히 모른다. XOR은 칩이 할 수있는 아주 자연스러운 동작이라고 생각했습니다. 몇 개의 NAND 게이트가 필요합니다. – Bathsheba

0

두 배열을 통해 for 루프는 충분합니다 :

int a[10]; 
int b[10]; 
int aLen = sizeof(a)/sizeof(int); /* we can do this since arrays are declared on the stack */ 
int bLen = sizeof(b)/sizeof(int); 
int currentContig = 0; 
int maxContig = 0; 

for (int aIdx = 0, int bIdx = 0; (aIdx < aLen) && (bIdx < bLen);) { 
    if (a[aIdx] == b[bIdx]) { 
     currentContig++; 
     aIdx++; 
     bIdx++; 
    } 
    else if (a[aIdx] > b[bIdx]) { 
     currentContig = 0; 
     aIdx++; 
    } 
    else { 
     currentContig = 0; 
     bIdx++; 
    } 
    if (currentContig > maxContig) { 
     maxContig = currentContig; 
    } 
} 

fprintf(stdout, "longest contiguous match: %d\n", maxContig); 
+0

for 루프를 사용하여 구현하지 않으려 고합니다. 매우 효율적인 구현을 원합니다. –

+0

당신이 그것을 복잡하게 만들고 있다고 생각합니다. 연속적인 일치를 요구 사항으로 보지 못했습니다. – Dukeling

0

int matched_num=0; 
while(a[matched_num]==b[matched_num]) 
matched_num++; 
printf("%d",matched_num); 

최종 인쇄 값이 두 배열에 일치하는 요소의 총 수있을 것입니다 아래와 같이 해보시기 바랍니다.