2014-02-07 2 views
-2

처음 8 비트와 16 비트 값의 마지막 8 비트를 바꿔 보려고했습니다. 예를 들어, 00000001 11001100은 11001100 00000001이됩니다. 글쎄, 어떻게 구현 해야할지 모르겠다. 다른 방법을 시도했지만 작동하지 않습니다 .... 어떤 도움을 주시면 감사하겠습니다. 이 질문이 간단하면 죄송합니다. 나는 이제 막 조금 배우기 시작했다. u.I 함수가 감사 : 값이 가정16 비트 값의 처음 8 비트와 마지막 8 비트 값을 바꿔서

unsigned short swap_bytes(unsigned short x) { 

} 
+5

그것은 당신이 –

+0

http://msdn.microsoft.com/en-us :-(* 어떤 * 방법을 시도했습니다처럼 보이지 않는 /library/336xbhcz.aspx –

+0

타입 정의 조합 미니 { 부호 숯 B [2] 서명 단편들; } 마이크로; – Manuel

답변

2
unsigned short swap_bytes(unsigned short x) { 
    unsigned short result; 
    result = (x >> 8) | (x << 8); 

    return result; 
} 

발터

+0

또는 그냥 :'return (x >> 8) | (x << 8); – lurker

+0

@mbratch 네,하지만 저는 그것을 더 분명하게하고 싶었습니다. –

2

정확히 16 비트이다.

unsigned short swap_bytes(unsigned short x) 
{ 
    unsigned short bitmask = 0x00FF; 
    unsigned short temp = x & bitmask; 
    x = x >> 8; 
    temp = temp << 8; 
    x = x | temp; 
    return x; 
} 

작동 원리 :

  1. 비트 마스크 = 0x00FF 후 8 앞에 0 비트와 8 후행 1 초에 값을 비트 마스크합니다.
  2. temp = x & bitmask는 temp를 8 개의 선두 0 비트로 만든 다음 8 비트를 x의 마지막 8 비트와 동일하게 만듭니다.
  3. x = x >> 8은 x의 가장 왼쪽 (최상위) 8 비트를 오른쪽으로 시프트하여 0으로 대체합니다.
  4. temp = temp < < 8 temp의 가장 오른쪽 8 비트를 왼쪽으로 시프트하여 0으로 대체합니다.
  5. x = x | temp는 x의 마지막 8 비트 (x는 이동하기 전에 처음 8 비트)와 temp의 처음 8 비트 (이동하기 전에 x의 마지막 8 비트)를 결합합니다.
0
#include <bitset> 
using namespace std; 
int main() 
{ 
    typedef union{ 
     unsigned char arr[2]; 
     short s; 
    }SwapBit; 

    SwapBit sb; 
    sb.s = 100; 

    cout<<bitset<16>(sb.s)<<endl; 
    std::swap(sb.arr[0], sb.arr[1]); 

    cout<<bitset<16>(sb.s)<<endl; 
} 

결과는 다음과 같습니다

0000000001100100 
0110010000000000 
+0

OP의 태그는 그가 C++가 아니라 C를 사용하고 있음을 나타냅니다. – lurker

관련 문제