programing

C/C++에서 부호 없는 오른쪽 시프트(>>>)를 수행하려면 어떻게 해야 합니까?

javajsp 2023. 10. 6. 20:53

C/C++에서 부호 없는 오른쪽 시프트(>>>)를 수행하려면 어떻게 해야 합니까?

C/C++에서 부호 없는 오른쪽 시프트(>>>)를 수행하려면 어떻게 해야 합니까?

C에서 부호 없는 이동을 하려면 부호 없는 유형에 대해 이동만 수행합니다.

unsigned int result = (unsigned int)valueToBeShifted >> shiftAmount;

다음과 같은 보장이 없다는 것을 참고하십시오.>>서명된 유형에서 C의 서명된 이동을 제공합니다. 이것이 구현 정의된 동작입니다.그러나 대부분의 일반적인 구현은 유형이 서명된 경우 서명된 이동을 생성합니다.

>>>부호 없는 오른쪽 시프트이므로 C에서는 다음과 같을 것으로 생각합니다.

unsigned int foo;
unsigned int bar = foo >> whatever;

C++에서 부호 없는 값에 대해 오른쪽 이동을 수행하는 것은 부호 있는 값에 대해 오른쪽 이동을 수행하는 것과 동일한 동작입니다.MSB가 설정되어 있으면 >>이 1로 이동합니다.

unsigned int myInt = 0x80000000;
myInt >>= 1;

myInt에 저장된 결과는 0xC0000000이 됩니다.

그러나 MSB가 설정되지 않은 경우 서명되지 않은 값에 대한 오른쪽 이동이 정상적으로 작동합니다.

unsigned int myInt = 0x40000000;
myInt >>= 1;

결과는 0x200000000이 될 것입니다.

따라서 C++에서 원하는 동작을 얻기 위해 다음을 수행할 수 있습니다.

  1. 한 번의 시프트를 수행하고 MSB를 제로로 만든 다음 나머지 시프트를 수행합니다.
  2. N비트를 오른쪽으로 이동하고, 상위 N비트를 0으로 제거합니다.

언급URL : https://stackoverflow.com/questions/2429479/how-do-i-perform-an-unsigned-right-shift-in-java-in-c-c