2013-04-22 2 views
0

부호가있는 13 비트 값에서 부호있는 16 비트 값으로 변환하는 데 더 좋은 방법이 있습니까? 두 값은 16 비트 워드에 있으며, 13 비트 값은 3 비트 시프트됩니다.부호가있는 13 비트 값을 부호있는 16 비트로 변환

S = Sign, O = Value bit, X = Unused 
a is the signed 13-bit | SOOO OOOO OOOO OXXX 
b is the signed 16-bit | SOOO OOOO OOOO OOOO 

현재 구현

b = a & 0x7FF8;  // Remove sign   XOOO OOOO OOOO OXXX 
b = b >> 3;   // Shift value 3 bit XXXO OOOO OOOO OOOO 
b = b | (a & 0x8000); // Add sign   SXXO OOOO OOOO OOOO 
+0

은 그로 컴파일 얻을합니까? 필자는 필자의 필사적 인 두뇌가 이해할 수없는 이런 것들에 대해 컴파일러가 까다로운 최적화를 수행하는 것을 보았습니다. 또한 당신이 목표로 삼고있는 아키텍처가 도움이 될 수 있다고 생각합니다. 당신은 언제나 'cs13bvts16b' 명령으로 어떤 CISC를 목표로 삼을 수 있습니다 ... –

+0

우리는 (a) 2의 보수 표현과 (b) C (또는 밀접하게 관련된 언어)에 대해 말하는 것을 확인할 수 있습니까? –

+0

@PaulR a) 맞습니다. 2의 보수입니다. b) 일반 솔루션을 찾고 구현시 구조화 된 텍스트를 사용하기 때문에 일부 의사 C를 입력했습니다. – ihatetoregister

답변

3
서명 유형에 대한

오른쪽 시프트는 구현 정의 -하지만 컴파일러 가정 (C에서, 적어도 당신은 실제로 당신이 여기에서 사용중인 언어 언급하지 않았다) 다른 컴파일러의 99 %처럼 당신이 필요로하는 모든이 다음 서명 값에 산술 오른쪽 시프트를 수행합니다

b = a >> 3; // Syyy yyyy yyyy yxxx => SSSS yyyy yyyy yyyy 

오브 분명히 이것을 테스트하거나 컴파일러 설명서를 확인해야합니다.

[이 우리가 값에 대한 2의 보수 표현을 얘기하고 있다고 가정도 주 - 다시는 귀하의 질문에 지정된 아니에요.]

관련 문제