본문 바로가기
Delphi/문법

델파이 shl 과 shr 설명

by MonoSoft 2021. 6. 18.
728x90
반응형

델파이 shl 과 shr 설명 

 

shr, shl은 논리연산자 or 비트연산자

각각 shift right, shift left 를 말한다.

 

011011 이라는 2진수가 있을때 

shr 2 하면 000110 이렇게 오른쪽으로 두칸 쉬프트 된다.

 

011011 을 shl 2 하면 101100 이 된다.

x shl y 에서 x를 y bit만큼 왼쪽으로 bitwise shift 한다.

이것은 곱하기와 나누기 효과를 낼 수 있는데요..

shl의 경우 x 곱하기 2의 y승 이 된다.

 

예를 들어..

 

01101(10진수로 13)을 shl 1 했을때의 결과는

11010(10진수로 26)이 되므로 

두배가 된 것을 알 수 있다.

 

이것은 활용하기 나름이구..

어떤 코드로의 encode, decode할때 많이 쓰이기도 한다.

참고로 not, and, or, xor도 같은 논리 연산자 이다.

 

=================================================

 

또 다른 설명....

 

x shl y 및 x shr y 연산은 x의 값을 

왼쪽 또는 오른쪽으로 y 비트만큼 이동한다.

(x는 부호없는 정수인 경우) 

x에 2 ^ y를 곱하거나 나누는 것과 같다. 

 

결과는 x와 동일한 유형이다. 

예를 들어 N이 01101 (10 진수 13) 값을 저장하면 

N sh1 1은 11010 (10 진수 26)을 반환한다. 

 

y 값은 x 유형의 크기로 모듈로 해석된다. 

예를 들어, x가 정수인 경우 정수는 32 비트이고 

40 mod 32는 8이므로 x shl 40은 x shl 8로 해석됨

아래를 보면~

 

32 및 64 비트 Windows 컴파일러 모두 XE3 및 XE5 로

이 작업을 실행했으며 위 코드에서 언급했듯이 출력이 일관된다.

 

(u8 shl 7) shr 7는 8 비트 유형의 컨텍스트에서 

완전히 평가 될 것으로 예상했다. 

 

따라서 비트가 8 비트 유형의 끝을 넘어 

이동하면 해당 비트가 손실된다.

 

내 질문은 프로그램이 작동하는 이유이다.

흥미롭게도 나는 프로그램을 C++로 변환했고 

64 비트 mingw 4.6.3에서 

동일한 출을 얻는다.

 

 

 

이유는 type promotion이다.

 

암시 적 유형 변환의 한 가지 특별한 경우는 유형 승격이다 

여기서  컴파일러는 자동으로 이진 표현을 확장한다.

정수 또는 부동 소수점 유형의 객체 프로모션은 

 

일반적으로 대상 플랫폼의 기본 유형보다 

작은 유형과 함께 사용 이를 위해 산술 및 

논리 연산 이전의 ALU ALU가 더 많은 작업을 수행 

할 수있는 경우 가능한 작업 또는 더 효율적

하나의 유형보다. C 및 C++는

부울, 문자, 넓은 문자, 열거 및 짧은 정수

int로 승격 된 유형 및 float 유형의 오브젝트의 경우

두 배로 촉진된다. 

 

다른 유형 변환과 달리 프로모션

절대 정밀도를 잃거나 객체에 저장된 값을 수정하지 말자.

 

다음 코드에서

 

u8 값은 shl 이전에 32- 값으로 승격되고; 

결과를 수정하려면 명시 적 유형 변환이 필요하다.

 

 

C++ 표준, 4.5 절 전체 프로모션 :

 

 char, signed char, unsigned char, short int 

또는 r 유형의 rvalue

  int가 나타낼 수 있으면 부호없는 

short int를 int 유형의 rvalue로 변환 할 수 있다.

  소스 유형의 모든 값; 

그렇지 않으면, 

소스 rvalue는

  unsigned int 유형의 rvalue로 변환된다.

 

델파이가 타입 프로모션에서 동일한 규칙을 따르는 지 

확인하기 위해 다음 애플리케이션을 작성한다.

 

728x90
반응형

댓글