RSH(Right Shift) 연산에서 최상위 비트가 1로 채워지는 이유는 보통 '산술 오른쪽 시프트' 연산이라고도 합니다. 이 연산은 부호 있는 정수에서 사용될 때 음수의 부호를 유지하기 위해 최상위 비트를 채우는 것이 일반적입니다.

음수의 경우, 최상위 비트가 1이기 때문에 음수임을 나타내며, 이 비트를 유지하기 위해 RSH 연산을 할 때 새로운 공간을 1로 채웁니다. 이것이 부호 있는 정수의 산술 오른쪽 시프트 연산의 특성 중 하나입니다.

반면에, LSH(Left Shift) 연산은 보통 0으로 공간을 채웁니다. 이것은 이동된 비트가 부호를 나타내는 데 영향을 미치지 않기 때문입니다.

언어나 컴퓨터 아키텍처에 따라 이러한 동작이 달라질 수 있으므로, 특정 환경에서의 쉬프트 연산 동작을 사용하기 전에 해당 환경의 문서나 명세를 확인하는 것이 중요합니다.

#define ENCODER_DATA_SIZE  ( 32 )
#define ENCODER_RESOLUTION ( 19 )
#define ENCODER_CONTROL_RESOLUTION ( 16 )
#define ENCODER_CONTROL_VALUE ( 32768 )

// Question 1
int encoder_convertToSigned16Bit (unsigned int singleTurn)
{
  // ( 0 ) -> ( 0 )
  // ( 2^(n-1)-1 ) -> ( 32767 )
  // ( 2^(n)-1 ) -> ( -32768 )
	int singleTurnBuff;
  singleTurnBuff = singleTurn >> ( ENCODER_RESOLUTION - ENCODER_CONTROL_RESOLUTION );
  singleTurnBuff -= ENCODER_CONTROL_VALUE;
  return singleTurnBuff;
}

// Question 2
int encoder_handleOverflowCondition (unsigned int singleTurn)
{
  static int preSingleTurn = 0;
  int singleTurnBuff, deltaPulse, returnValue;

  singleTurnBuff = ( singleTurn << ( ENCODER_DATA_SIZE - ENCODER_RESOLUTION ) );
  preSingleTurn = preSingleTurn << ( ENCODER_DATA_SIZE - ENCODER_RESOLUTION );
  deltaPulse = singleTurnBuff - preSingleTurn;
  returnValue = deltaPulse >> ( ENCODER_DATA_SIZE - ENCODER_RESOLUTION );
	preSingleTurn = singleTurn;
  
  return returnValue;
}

혹시 Question1의 입력으로, 유즈케이스에서 무조건 24(23??)비트 영역이 들어오나요?? 아니면 2^n으로 가변적인가요??

Question 1이 unsigned 24비트 영역을 signed 16비트 영역으로 사상하는거 맞죠??

→ 맞습니다

#define ENCODER_RESOLUTION ( 19 ) 은 뭔가요??

→ 엔코더 분해능이라고 부르는데 한바퀴 (360도)를 2^19으로 나눈 값을 의미합니다.

Resolution 이 24도 있고 19도 있고 16도 있나보네요

네맞아요 성능에 따라 다른거라서

encoder resolution 24bit : 16777216 360/16777216 = 0.000021457672119140625°/bit

encoder resolution 19bit : 524288 360/524288 = 0.0006866455078125°/bit

encoder resolution 16bit : 65536 360/65536 = 0.0054931640625°/bit

내가 얼마나 잘짯나 테스트 직접 돌려본다 ㅋㅋㅋ