2014-02-23 3 views
0

나는 엔디 언과 비트 쉬프트가 혼동 스럽다고 생각합니다. 제발 도와주세요.8 비트 정수를 32 비트로 변환하기

32 비트 정수로 변환하려는 4 개의 8 비트 정수가 있습니다. 이것은 내가하고있는 것입니다 :

uint h; 
t_uint8 ff[4] = {1,2,3,4}; 

if (BIG_ENDIAN) { 
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]); 
} 
else { 
    h = ((int)ff[0] >> 24) | ((int)ff[1] >> 16) | ((int)ff[2] >> 8) | ((int)ff[3]); 
} 

그러나 이것은 잘못된 결과를 만들어내는 것 같습니다. 약간의 실험을 통해 나는 그것이 다른 방향이어야한다는 것을 깨달았습니다. 빅 엔디안의 경우 비트를 오른쪽으로, 그렇지 않으면 왼쪽으로 이동해야합니다. 그러나 나는 왜 그런지 이해하지 못한다.

이렇게 이해합니다. 빅 엔디안은 가장 중요한 바이트를 먼저 의미합니다 (첫 번째는 가장 왼쪽에 있음을 의미). 따라서 8 비트 int를 32 비트 int로 변환하면 기존 8 비트에 24 개의 0이 추가됩니다. 그래서 그것을 1 바이트 째로 만들기 위해서는 비트 24를 왼쪽으로 옮겨야합니다.

내가 잘못했음을 지적하십시오.

+1

글쎄,'ff [0] >> 24'는 무엇입니까? 그것을 손으로하고 결과를보십시오. 맞습니까? – hyde

+0

아마도 노동 조합과 함께하려고합니까? – AdamF

+0

"잘못된 결과"가 나옵니다. 어떤 결과를 얻었으며 예상했던 것과 다른 결과를 얻었습니까? –

답변

3

항상 8 비트 값을 왼쪽으로 옮겨야합니다. 그러나 리틀 엔디안의 경우 인덱스의 순서를 변경해야하므로 네 번째 바이트가 가장 중요한 위치로 이동하고 첫 번째 바이트는 최하위 바이트로 이동합니다.

if (BIG_ENDIAN) { 
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]); 
} 
else { 
    h = ((int)ff[3] << 24) | ((int)ff[2] << 16) | ((int)ff[1] << 8) | ((int)ff[0]); 
} 
+0

그렇다면 8 비트 정수를 32 비트 정수로 변환 할 때 항상 엔디 언과는 무관하게 왼쪽에 24 개의 0이 추가된다는 의미입니까? – redFur

+0

예 (부호없는 값의 경우에만, 부호가있는 값의 경우에만 해당 값이 음수이면 왼쪽에 24 * 개 *를 얻을 수 있음). 엔디안은 비트 순서가 아닌 바이트 순서에 관한 것입니다. – nwellnhof

+1

@IvanInTheHat 8 비트 정수를 32 비트 정수로 변환하면 * 값 *이 변경되지 않습니다. 따라서 종이에서 이진수로 보는 경우 값을 변경하지 않고도 0을 추가 할 수있는 곳은 실제로 "왼쪽 위"입니다. 일부 CPU 아키텍처에서 메모리에 저장되는 방식은 종이에 표시되는 방식이나 유지해야하는 가치에 영향을주지 않습니다. – hyde