programing

당신은 오른쪽 시프트가 C에서 무엇을 채우는지 조절할 수 있습니까?

powerit 2023. 10. 10. 21:15
반응형

당신은 오른쪽 시프트가 C에서 무엇을 채우는지 조절할 수 있습니까?

C에서 왼쪽 시프트 비트 와이즈 연산자를 사용할 때 빈 비트가 0으로 채워지는 것으로 알고 있습니다.그러나 올바른 시프트는 구현에 의존적이라는 것을 읽었습니다. 즉, 어떤 기계에서는 빈 비트가 0으로 채워지고, 어떤 기계에서는 1로 채워집니다.

저는 프로그램에서 올바른 시프트를 사용하고 있으며, 실제로 제 기계는 빈 비트를 1s로 채우고 있습니다.문제는 제가 대신 0으로 채워야 한다는 것입니다.

오른쪽 시프트에서 0을 강제로 사용할 수 있는 방법이 있습니까?

한 가지 해결책은 오른쪽 시프트가 적용된 후에 0111111과 같은 마스크를 생성한 다음 비트와이즈 AND를 적용하여 가장 왼쪽에 삽입된 1을 0으로 변경하는 것입니다.

하지만 이것은 번거롭고 시간을 낭비합니다.내 기계에 오른쪽 시프트를 1초로 채우라고 말하는 방법이 있다면 훨씬 더 쉬울 것입니다.

감사해요.

번호를 다음으로 지정합니다.unsigned그리고 교대를 합니다.그렇게 하면 0이 채워집니다.

아니, 그럴 수 없다.

부호가 없는 유형의 이동은 잘 정의되며(오른쪽 피연산자가 음이 아닌 경우와 왼쪽 피연산자의 폭보다 작은 경우), 항상 0으로 채워집니다.

부호화된 유형에 대한 이동(또는 임의의 비트 단위 연산)은 일반적으로 좋은 생각이 아닙니다.<<정의되지 않은 행동을 가지고 있습니다.>>는 구현 정의 결과(컴파일러가 수행하는 작업을 문서화해야 하지만 사용자가 제어할 수 있는 방법이 없음을 의미함)를 산출합니다.서명된 유형의 음이 아닌 값의 경우 오버플로가 되지 않는 한(오버플로가 되면 동작이 정의되지 않음) 예상되는 결과가 됩니다.

C99 표준은 다음과 같이 말합니다(섹션 6.5.7).

각 피연산자에 대해 정수 승격이 수행됩니다.결과 유형은 승격된 왼쪽 피연산자 유형입니다.오른쪽 피연산자의 값이 음수이거나 승격된 왼쪽 피연산자의 너비보다 크거나 같으면 동작이 정의되지 않습니다.

E1 << E2는 E1 왼쪽 시프트된 E2 비트 위치입니다. 빈 비트는 0으로 채워집니다.E1에 부호가 없는 유형이 있는 경우 결과 값은 E1 × 2로E2, 결과 유형에서 나타낼 수 있는 최대값보다 하나 더 감소된 모듈로입니다.만약 E1이 부호가 있는 유형과 음이 아닌 값을 가지고 있고, E1E2 × 2가 결과 유형으로 표현 가능하다면, 그것은 결과 값이고, 그렇지 않으면 동작은 정의되지 않습니다.

E1 >> E2의 결과는 E1 우이동 E2 비트 위치입니다.E1이 부호가 없는 유형이거나 E1이 부호가 있는 유형과 음이 아닌 값을 가지면 결과 값은 E1/2의E2 몫의 적분 부분입니다. E1이 부호가 있는 유형과 음의 값을 가지면 결과 값은 구현으로 정의됩니다.

11년 이상이 지난 후에 이러한 답변으로 돌아온 구현은 분명 구현 정의 이동의 동작을 제어할 수 있는 옵션을 제공할 수 있습니다.저는 그런 것에 대해 전혀 모릅니다.

C99 규격을 인용했습니다.이후 판에서는 관련된 변화가 없었던 것 같습니다.

오른쪽 시프트 연산에는 산술 연산과 논리 연산 두 가지가 있습니다.

논리 시프트는 C의 부호 없는 숫자와 함께 사용됩니다.항상 0으로 높은 비트를 채웁니다.이것이 당신에게 필요한 것입니다.

산술 이동은 이동하는 숫자의 부호를 보존하기 때문에 부호가 있는 숫자와 함께 사용됩니다.숫자가 양수이면 가장 유의한 비트가 0이 되고 0으로 채워집니다.숫자가 음수이면 가장 유의한 비트가 1이므로 1로 채워집니다.

자바에서는 실제로 다음과 같은 연산자를 사용합니다.>>산술적으로>>>이치에 맞는Java에 서명되지 않은 형식이 없기 때문에 이 작업이 필요합니다.

언급URL : https://stackoverflow.com/questions/8422424/can-you-control-what-a-bitwise-right-shift-will-fill-in-c

반응형