2013-04-12 2 views
1

첫 번째 바이트 = 2 (dec) 및 두 번째 바이트 = 1 (dec)이라고 말합니다.2 바이트를 16 비트 값으로 변환하는 가장 효율적인 방법은 무엇입니까?

따라서 첫 번째 바이트는 257 (dec)을 나타냅니다. 따라서 두 번째 바이트는 1 (dec)을 나타냅니다.

따라서 총 16 비트 값은 258 (dec)입니다.

내가 할 그래서 경우 :

(byte1*256)+byte2 

는 '올바른'방법은 그것을 할인가요? 아니면 더 좋은 방법이 있습니까?

감사합니다,

답변

1

T.이 작동합니다 :

(byte1<<8) | byte2 

하지만 여기에 함정이있을 수 있다는 생각 해요. byte1byte2 데이터 형식이 1 바이트 (즉 8 비트) 인 경우에는 시프 팅이 도움이되지 않습니다.

당신이 해낸 방법이 완전히 멋지다고 생각합니다. 그러나 차기를 들어,이 같은 아마도 작동합니다 :

int16 total = byte1; 
total = (total<<8) | byte2 
+0

(byte1 << 8) & byte2가 더 좋은 –

+0

일 수 있습니다.이 아이디어는 schnazzy입니다. 감사합니다. 업데이트 된 답변. – Jace

+1

실제로는 분명히 분명한 이유 때문에 '|'가 아닌'&'이되어야합니다! 혼란을 피할 수 있도록 수정했습니다. – Voo

0

당신은 비트를 이동 시프트 연산자, 사용할 수 있습니다 (< 8 < 바이트 1)을 왼쪽 쉬프트 + 바이트 2

은 동일

(2 < < 8) 인 (0B 0000 0010 < < 8) (0B 10 0000 0000)와 동일하고, 상술 한 예에서는 2의 멱수 승산.

바이트에 8 비트가 있기 때문에 8 씩 이동합니다.

가장 현대적인 최적화와
4

은 그 일을 전혀 "적절한"방법이 없습니다 : 코드가 하부 및 상부에 별도로

  • 로드 바이트를 포함하여 시스템에 가장 빠른 무엇이든로 변환 할 것 부분 레지스터 - 변환이 진행되지 않고 바이트가 각각의 위치에 직접로드됩니다.
  • 비트 상위 바이트 시프트 논리합 하위 바이트 - 다른 + 대신의 | 제외하고 상기와 같은 - byte1<<8 | byte2
  • 비트는 상위 바이트 시프트 및 하위 바이트 추가 같은 것을
  • 시스템에서 빠르게 작동하는 것과 완전히 다른 것 - 아키텍처에 따라 위에서 설명하지 않은 아키텍처 별 최적화가있을 수 있습니다.

소스 코드에서 사용자의 의도를 명확하게하는 데 집중해야합니다. 독자에게 가장 이해가가는 256을 곱하면 곱셈을 사용하십시오. 비트 시프 팅이면 비트 시프 팅을 사용하십시오.컴파일러는 코드를 최대한 효율적으로 처리합니다.

+0

나는 일반적인 감정에 동의하지만, 나는 변화와 갈기가 내 경험에서 가장 잘 보이고 가장 잘 이해 된 접근이라고 말하고 싶다. + 역시 놀랍지는 않지만, 곱셈을 사용하면 코드를 두 번 확인하게됩니다. – Voo

+0

@Voo 요즘에는 소금의 가치가있는 컴파일러가'x * 256'을'x << 8'로 변환합니다. 몇 년 전 프로덕션 코드에서'(byte1 * 256) + byte2'와 같은 구조를 보았고 비트 시프트와 OR로 조금 최적화하기로 결정했습니다. 놀랍게도, 컴파일 된 코드에는 필자의 변화와 OR이 없었습니다 : LDA byte2; LDB byte1'을 사용하여 "composite"레지스터를로드합니다 (내 대답에서 옵션 1). 그것은 내가 옵티 마이저를 가볍게 먹지 않는 날이었습니다. :) :) – dasblinkenlight

+0

저는 컴파일러에 대해 이야기하는 것이 아닙니다. 현대 컴파일러가이 상황을 잘 처리 할 수 ​​없다면 나는 놀랄 것입니다. (항상 피승수에 따라 다릅니다. 'lea'와 같은 것들). 가독성에 관한 것입니다. 저는 저급 물건으로 꽤 많이 일했고 거의 모든 곳에서 변화와 접근법을 보았습니다. 변화와 추가는 나를 놀라게하지 않을 것이다. 그러나 만일 누군가 내가 그것을 곱하면 그것이 최소한 내가 그들의기도를 최소한 두 번 점검하게 할 것이다. – Voo