2012-06-04 5 views
5

바이트 배열에서 12 비트 정수를 읽습니다. 그 숫자는 음수 일 수 있지만, C#에서는 사용 가능한 변수 int16/int32로 변환하는 방법을 알 수 없습니다. 비트 시프 팅 (bit shifting)이나 다른 비트 연산 (bitwise operation)을해야 할 필요가 있다는 생각이 들지만, 지금까지 눈에 띄었다. 누군가가 올바른 방향으로 나를 가리킬 수 있습니까?12 비트 정수를 16 또는 32 비트로 변환하십시오.

var x = 0xFFF;

-1로 인쇄해야하지만 자연스럽게 int32로 변환되어 4095로 인쇄됩니다.이 경우 int16 또는 int32로 변환해야합니다. 음수 값을 유지하려면 어떻게해야합니까?

답변

13

32 비트 : 조건문없이

x = (x >> 11) == 0 ? x : -1^0xFFF | x; 
+0

대단히 감사합니다. 여기서 무슨 일이 벌어지고 있는지 설명하는 마음? 나는 무엇을 알고있다. >>^하지만 꽤 이해하지는 마라. – Clarke76

+2

기본적으로 부호 비트 만 남을 때까지 오른쪽으로 이동합니다. 0이면 원래 값을 반환합니다. 1이면 -1 (0xFFFFFFFF), 하위 12 비트 ('xor')를 끈 다음 원래 값으로'or'하여 비트를 켭니다. 결과는 기본적으로 32 비트 값의 상위 20 비트 만 켜는 것입니다. –

+0

예 ... 나는 종이에 모든 것을 쓰고 결국 무슨 일이 일어 났는지 보았습니다. 정말 도움이되었습니다. 마지막 비트가 부정적인 플래그로 사용된다는 사실을 알았습니다. 그 후에는 쉽게 따라 할 수있었습니다. 다시 한번 감사드립니다. – Clarke76

8

부호 확장, 서명 짧은 이미 들어있는 12 비트 값을 x입니다 가정 :

x = (x << 4) >> 4; 

괄호는 무슨 일이 일어나고 있는지 이해하기위한 순수 있습니다. 비트 시프트는 다른 산술 및 논리 연산자처럼 왼쪽 연관입니다. 이것이 작동하는 이유는 >>이 서명 된 유형의 산술 오른쪽 시프트이기 때문입니다. 즉, 최상위 비트에서 0을 이동하는 대신 MSB를 필요한만큼 반복합니다. n 비트 m에 비트에서 일반적으로

부호 확장은 다음과 같다 : long에 대한

x = (x << (m - n)) >> (m - n); 
sbyte 8로 제한 될 것 m 분명한 이유를 들어

, 16 short를 들어, 32 int 및 64. 다시 말하지만, 괄호는 순전히 화장품입니다. 빼기는 비트 시프트보다 더 가깝습니다.

0

부호 비트를 감지하고 그것을 확장하십시오. 16 비트의 경우 :

x = (x & 0x800 ? x^0xf000 : x); 
관련 문제