2011-10-16 3 views
27

의 n 번째 바이트를 얻을 c는하지만 정수의 n 번째 바이트를 얻을하는 방법을 모르겠어요. 예를 들어, 1234는 00000000 00000000 00000100 11010010은 32 비트 정수로 어떻게 그 바이트를 모두 얻을 수 있습니까? 첫 번째는210 일 것이며, 제 4 될 마지막 두 것이다 0는</p> <pre><code>int x = number & ((1<<8)-1); </code></pre> <p>또는 <pre><code>int x = number & 0xFF; </code></pre> <p></p>를 사용하여 당신이 첫 번째 바이트를 얻을 수있어 정수

+1

예제에서 이미 비트 이동 연산자'<<'를 사용하고 있습니다. 당신의 숫자에서 다른 비트를 얻기 위해 어떻게 시프트 연산자를 사용할 수 있습니까? –

+0

다른 비트 시프트 연산자를 시도하십시오. –

+1

"첫 번째 바이트"- 여기서 사용한 것처럼 - 메모리의 첫 번째 바이트가 아닐 수도 있습니다. 귀하의 예 (1234)는 가장 낮은 주소에서 '11010010', 가장 높은 주소에서 '00000000'이 될 수 있습니다. – Thanatos

답변

60
int x = (number >> (8*n)) & 0xff; 

여기서 n 등 첫번째 바이트 번째 바이트 1

+12

괄호를 사용하십시오! '>>'또는'*'가 더 높은 우선 순위를 가졌는지 여부는 결코 구성원이 될 수 없습니다. –

2

int nth = (number >> (n * 8)) & 0xFF;

0이고

가장 낮은 바이트로 옮겨 "익숙한"방식으로 가져옵니다. 를 들어

int x = ((unsigned char *)(&number))[n]; 

(N 다음 (N + 1) (도 리틀 엔디안 86와 같은 기계에 상당한 most-하는 이내로 할 경우)가 메모리에 나타나는 어떤 순서 바이트 일에 대한

12

1) 이상에서 빅 엔디안 시스템에서 가장 중요한에 바이트 일 : 이상에서) 가장 중요한 (모든 엔디안 바이트 번째 (N + 1의 경우

int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n]; 

) :

int x = ((unsigned int)number >> (n << 3)) & 0xff; 

물론이 모두는 n < sizeof(int)이고 그 중 numberint이라고 가정합니다.

+0

우리가 int의 배열을 가지고 있다면, 어떻게 대답이 바뀔까요? int 배열의 시작 부분에서 n 번째 바이트의 값을 얻는 방법은 무엇입니까? – HoseinGhanbari

+0

@HoseinGhanbari 같은 방법이지만'(n/sizeof (int)) '번째 배열 요소의'(n % sizeof (int))'번째 바이트를 찾으십시오. – Dmitri