2012-11-30 3 views
1

가능한 중복 :
convert big endian to little endian in C [without using provided func]부호없는 정수

나는이 한 부분에 문제가있어 : 나는 32 비트 수를 가져 가고 싶어하면, 내가 원하는 빅 엔디안에서 리틀 엔디안 형식으로 바이트 (1 바이트 = 8 비트)를 이동합니다. 예를 들어 :

:이처럼 보이도록 내가 원하는

1st byte 2nd byte 3rd byte 4th byte 
00000000 00000000 00000000 00000001 

:

이는 것처럼 보일 것이다 것입니다 내가 32 비트에서 숫자 1

가 있다고 가정하자

4th byte 3rd byte 2nd byte 1st byte 
00000001 00000000 00000000 00000000 

최소 유효 값을 가진 바이트가 먼저 나옵니다. for 루프를 사용할 수 있다고 생각했지만 C++에서 비트/바이트를 이동하는 방법에 대해서는 확실하지 않습니다. 예를 들어 사용자가 1로 입력하고 위의 예와 같이 비트를 이동해야한다면 1을 비트로 변환 한 다음 전환하는 방법을 모르겠습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 감사!

+2

@NPE 어떻게 중복 될 수 있습니다 심지어 같은 언어 아니라면? –

+1

숫자와 연산에 관한 대부분의 규칙이 C에서 C++로 이월되기 때문에? – cHao

+0

@LuchianGrigore : 물론, 제 견해로는 여전히 "변하는 비트와 바이트"에 관한 것이지, "멋진 C++ 스타일에서 이것을 어떻게 할 것인가"에 관한 것이 아니기 때문에 여전히 복제되어 있습니다. 물론 커뮤니티는 다르게 결정할 수 있습니다. – NPE

답변

3

<<>>은 C 및 대부분의 다른 C 스타일 언어의 비트 시프트 연산자입니다. 당신이 원하는 것을 할 수

한 가지 방법은 다음과 같습니다

int value = 1; 
uint x = (uint)value; 
int valueShifted = 
    (x << 24) |    // Move 4th byte to 1st 
    ((x << 8) & 0x00ff0000) | // Move 2nd byte to 3rd 
    ((x >> 8) & 0x0000ff00) | // Move 3rd byte to 2nd 
    (x >> 24);     // Move 4th byte to 1st 
+0

이 질문은 정확하다고 생각하여 처음에 답안을 삭제했지만 UB가 '가치'의 큰 값을 찾았다. –

+0

나는 이것이 네거티브에 대해 실패했다고 생각한다. –

+0

* 네거티브는 실패 할 수 있습니다. 예. 음수를 왼쪽 시프 팅하면 기술적으로 UB가 호출되고 우 시프 팅은 대부분의 시스템에서 1로 시프트됩니다. int가 부호가 없다면 ... – cHao

2
uint32_t n = 0x00000001; 
std::reverse((char*)&n, (char*)(&n + 1)); 
assert(n == 0x01000000); 
+0

문자의 크기가 8 비트가 아닌 경우 이상하게 만듭니다. int와 chars가 모두 32 비트 인 경우, 역순으로 아무것도 수행하지 않습니다. – cHao

+0

@cHao'C++ 표준은 1 == sizeof (char)'를 보장하며, 우리는 32 비트'unsigned int '타입을 가지고 있습니다. 그래서 어떻게 7 비트 char을 사용하여 어떻게 시뮬레이트 할 수 있습니까? – BigBoss

+0

'sizeof (char) == 1'은 char이 1 바이트라고 약속합니다. 그 바이트의 크기에 대해서는 아무 것도 약속하지 않는다. 표준은 바이트 당 적어도 * 8 비트가 필요하지만 더 많은 것을 허용합니다. 8, 9, 16, 32, 36, 심지어 64 비트 바이트를 가진 시스템 (특별한 경우에는 여전히 존재 함)이 있습니다. 내 32 비트 예제에서,'sizeof (int) == 1'. 1 바이트가 있으면 교환 할 것이 없습니다. – cHao

0

시프 팅은 <<>> 사업자로 이루어집니다. 함께 현명한 비트 AND (&)와 OR에 당신은 당신이 원하는 것을 할 수 있습니다 (|) 운영자 :

int value = 1; 
int shifted = value << 24 | (value & 0x0000ff00) << 8 | (value 0x00ff0000) >> 8 | (value 0xff000000) >> 24; 
+0

큰 값의 'value'에 대해서는 UB라고 생각합니다. –

+0

"UB"는 무엇을 의미합니까? –

+0

정의되지 않은 동작 –

관련 문제