2010-07-29 2 views
0

8 바이트 길이의 unsigned char을 예상하는 함수가 있습니다.두 개의 32 비트를 효율적으로 결합합니까? - C

void f1(unsigned char *octets) 
{ 
    unsigned char i; 
    for (i=0;i<8;i++) 
    printf("(%d)",octets[i]); 
} 

이 내가 하나 개의 64 비트 정수있는 동안 내가 그것을 사용하는 방법입니다 : (.이 기계의 기본 엔디 언을 사용)

unsigned long long ull = 1; 
    f1((unsigned char *) &ull); 

내 질문 경우 대신 가진 1x64bit 정수의입니다 , 2x32bit 정수가 있습니다.이 특정 함수의 입력으로 효율적으로 결합 할 수있는 방법이 있습니까?

unsigned long int low = 1; 
    unsigned long int high = 0; 
+1

답변에 대한 귀하의 의견은 기능을 변경할 수 없으며 '비효율적'이므로 기존 메모리 위치에서 데이터를 옮기고 싶지 않은 것으로 보입니다. 그렇다면 대답은 '아니오'입니다. 하나의 포인터가 두 개의 인접하지 않은 메모리 위치를 가리킬 수 없습니다. – Patrick

+0

Aidan Cully의 두 번째 의견에 따르면 이러한 효율성을 달성 할 방법이 없습니다. 그래서 나는 그것을 명확히하는 그의 두 번째 코멘트에 대한 그의 대답을 선택했습니다. –

+0

@ 패트릭 : 명확하게 또한 주셔서 감사합니다. –

답변

3

가 노동 조합 활동을 이식합니까? 그렇다면 좋은 접근 방법입니다. ...

union { 
    struct { 
     unsigned char CharArray[8]; 
    } ub; 
    struct { 
     unsigned long int IntArray[2]; 
    } ul; 
    unsigned long long ull; 
} Foo; 
+0

변수 "low"와 "high"는 함수처럼 주어진 것입니다.이 특정 함수에 대한 유효한 입력으로 작동하도록 현재 메모리 할당을 '결합하는'효율적인 접근 방법이 있는지 궁금합니다. –

+1

내가 올바르게 당신을 이해한다면, 그렇지 않습니다. 변수가 메모리에 인접하여 저장되면 64 비트 포인터가 사용하는 메모리가 정확하게 두 변수에 오버레이되도록 64 비트 유형으로 주소 중 하나를 강제 변환 할 수 있지만 이식성/견고성은 없습니다 그것이 그럴 것이라고 보장하는 방법. 변수가 메모리에 저장되는 것이 아니라 CPU 레지스터에 저장되는 것을 고려하십시오. –

+0

나는 memcpy()로 그렇게 할 수 있다고 생각한다. 그러나 컴파일러는 아마 그것을 최적화하여 성능에 영향을 미치지 않을 것이다. – vtorhonen

3

당신은 단지 배열에 넣어 수 :

unsigned long int lohi[2] = {1, 0}; 
f1((unsigned char *) lohi); 

편집 : 사용하여 기존 변수 :

unsigned long int lohi[2] = {lo, hi}; 
+0

변수의 상한 및 하한이 주어진 경우 어떻게됩니까? –

+0

즉, 이러한 변수의 원래 할당을 사용하는 '효율적인'방법이 없다는 의미입니까? –

+2

@ 도리 바 : 원래 할당을 다시 사용하려면 원래 할당이이 방법으로 재사용하기에 적합하다는 것을 보장해야합니다. 이를 보장하는 방법은 원래 할당 대신 독립 변수 대신 배열을 사용하는 것입니다. –

2

타입 변환, 비트 시프트 및 비트 단위 또는.

unsigned long int low = 1; 
unsigned long int high = 0; 
unsigned long long ull = (unsigned long long) high << 32 | low; 
+0

효율적인 방법이 없다는 의미입니까? –

+0

내 또는 에이 든의 대답처럼이 메모리를 인접 메모리에 복사하기 만하면이 방법보다 빠를 가능성이 높습니다. 그러나 실제로 사본을 만들 수는 없습니다. – tzaman

+0

비트 연산자가 효율적이지 않습니까? 그렇다면 효율적인 무엇입니까? –

0

union과 struct를 조합하여 이름을 유지하고 배열을 사용하지 않을 수 있습니다. f1를 호출 할 때 당신이, 그리고 ull 사용 하듯이

union { 
    struct { 
     unsigned long int low = 0; 
     unsigned long int high = 1; 
    }; 
    unsigned long long int ull; 
}; 
사용 low

high. 그러나이 방법으로 쓰는 것에주의하십시오. 리틀 엔디안 주문을 가정합니다.

또한 Linux 및 다른 UNIX의 경우 64 비트 모드에서 long intlong long int은 모두 int이 32 비트입니다. 내가 아는 것 중에서 Windows는 오직 long int을 64 비트 모드에서 32 비트로 가지고 있습니다. 그것을보고의

+0

대소 문자는 주어진 것입니다. 따라서 효율적인 대처 방법을 달성하기 위해 함수 나 변수를 변경하는 것은이 경우에 유효하지 않습니다. 내 질문은 오히려 특정 시나리오를 처리하는 올바른 방법을 배우는 것이 었습니다. 귀하의 의견을 보내 주셔서 감사합니다. –

0

다른 방법 : 두 함수 모두 같은 이름을 가질 수있을 때 C++에서

void f1(unsigned char* octet) 
{ 
    f2(octet, octet + 4); 
} 

void f2(unsigned char* quad1, unsigned char *quad2) 
{ 
    unsigned char i; 
    for (i=0;i<4;i++) 
     printf("(%d)",quad1[i]); 
    for (i=0;i<4;i++) 
     printf("(%d)",quad2[i]); 
} 

작품보다.

+0

하지만 함수가 주어진다. 내 질문은 오히려 특정 시나리오를 처리하는 올바른 방법을 배우는 것이었다. 입력 해 주셔서 감사합니다. –

관련 문제