2014-01-10 4 views
3

다음과 같이 16 진수의 바이트를 반대로하고 싶습니다.16 진수의 바이트를 반대로하는 방법은 무엇입니까?

0x08090a0b0x0b0a0908으로 변환해야합니다.

이 매크로를 사용했습니다.

#define REV(X)  ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24)) 
+1

그래서 당신이 원하는 것을 얻을 수 있었습니까? – const

+1

이 문제는 정수를 뒤집는 것과 정말로 다른가요? –

+1

무엇이 문제입니까? 이 방법은'sizeof (X)> 4 '또는 X가 서명 된 경우에만 문제를 볼 수 있습니다. –

답변

0

check this #

int main(void) 
    { 
    // your code goes here 
    unsigned int X = 0x08090a0b; 

    printf("%8x", ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))); 
    return 0; 
    } 

귀하의 출력은 올바른 것입니다. 처음에는 0이 표시되지 않는다고 말하는거야? 귀하의 경우

09 = 9 x0b0a0908 = b0a0908

1

그것은 깨끗하고 당신이 마스크로 이동 결합 할 경우, 따라하기 쉬운 : I 별도로 전체 표현 및 해당 구성 요소를 모두 보여 아래. 마스크에 선행 제로가 필요하지 않음을 유의하십시오. 명확성/정렬을 위해 거기에 넣습니다. 그리고 첫 번째와 마지막 학기에는 마스크가 필요하지 않습니다. "원치 않는"비트가 모두 표현식에서 벗어나기 때문입니다. 한 번에

#define REV(X) ((X << 24) | ((X & 0xff00) << 8) | ((X >> 8) & 0xff00) | (X >> 24)) 

1 바이트 :

#define R1(X) ((X & 0x000000ff) << 24) 
#define R2(X) ((X & 0x0000ff00) << 8) 
#define R3(X) ((X & 0x00ff0000) >> 8) 
#define R4(X) ((X & 0xff000000) >> 24) 

이 수를 제대로 출력이 앞에 0이 인쇄되어 있는지 확인합니다

printf("%08x", REV(x)); 

을 사용합니다. 이 작업을 올바르게 수행하려면 입력이 32 비트 부호없는 정수인지 확인해야합니다.

+0

고맙습니다. 알았다. –

+0

아주 쉬운 설명. 오프 모자! – Gomu

관련 문제