2012-03-15 4 views
2

최근 Java에서 시프트 연산자를 사용하여 >> 연산자가 C에서 >>과 동일한 의미가 없음을 알게되었습니다. >>은 첫 번째 비트를 동일한 값으로 유지하는 부호있는 시프트입니다. Java에서 C 시프트와 동일한 것은 >>> 연산자입니다. 왼쪽 시프트 연산자 (<<)는 C와 동일하며 첫 번째 비트를 무시하고 시프트합니다. 내가 궁금Java에서 시프트 연산 구현

일들이 변경 왜

  • 이다?
  • 표기법이 일관되지 않은 이유 >> 및 < <은 부호가 있고 >>> 및 < < <은 부호가 없습니까?
  • 부호있는 시프트 연산자가 있습니까?
+0

Java에는 부호없는 유형이 필요하기 때문에 필요합니다. Btw는 이미 귀하가 제안한대로입니다 : >>는 서명되어 있고 >>>는 서명되어 있지 않습니다. << <<와 같은 일을하기 때문에 <<<가 없습니다. – harold

+0

AFAIK'a >> b'는 서명 된 타입에 대해서도 C에서 부호있는 시프트입니다. http://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_C.2C_C.2B.2B.2C_C.23 –

+0

C의 모든 시프트는 머신에 따라 다르지만 대부분 >> >> 부호가 없습니다. – nist

답변

2

2 : s 보수 표현은 최상위 비트에 부호를 저장하므로 기호 인식 왼쪽 시프트가 필요하지 않습니다.

어떤 종류의 "기호 인식"방식으로 왼쪽으로 1 비트 시프트 한 값과 다른 방식으로 할 수있는 값 사이에는 차이가 없습니다. 비트를 왼쪽으로 시프트하고, 최하위 비트에 0을 삽입하면 완료됩니다.

부호있는 숫자의 경우 오른쪽으로 시프트하는 것이 이 아니고이 아니므로 두 명의 연산자가 필요합니다.

+0

그러나 모든 종류의 시프 팅은 최상위 비트를 변경합니다. 부호있는 int를 사용하여 0111 (7)을 왼쪽으로 시프트하면 1110 (-2) – nist

+0

이됩니다. 맞습니다. _ 모든 종류의 변화가 그렇게 할 것입니다. 따라서 어떤 종류의 것을 사용하든 관계 없습니다. –

+0

글쎄, 그래, 그런 교대의 결과가 있어야한다고 당신은 무엇을 제안합니까? 14 비트 부호있는 정수로 14 (= 7 << 1)을 나타낼 수 없으므로 결과가 어쨌든 가비지가 될 것입니다. – Darhuuk

1

부호있는 왼쪽 시프트와 부호없는 왼쪽 시프트는 정확히 동일하므로 별도의 연산자가 필요하지 않습니다.

반면에 Java에는 부호없는 유형이 없으므로 유형에 의존하여 사용할 교대를 결정할 수 없습니다.

참고로, 나는 뒤쪽으로 가지고 있다고 생각합니다 - >>은 오른쪽 시프트로, 부호없는 오른쪽 시프트는 >>>입니다.

2

내가 아는 한 >>>>>의 의미는 항상 Java에서 동일합니다.

왜 변경해야합니까?

기계 독립성. >>의 의미는 C에 다소 의존적으로 구현됩니다.

+0

+1 기본 하드웨어에서 추상화하기 위해 Java가 작성되어 각 운영자가 모든 컴퓨터에서 동일한 방식으로 작동합니다. –

+0

@AaronDigulla, 정확하게. JVM (Java Virtual Machine)은 자바를 "한 번 쓰고 어디에서나 실행할 수 있습니다"(또는 그렇게 판매 한 추상 하드웨어입니다 :-). – ldav1s