2017-11-27 4 views
0

REPL에서 재생 중이므로 >>>>>에 대한이 동작이 나타납니다. Long이 64 비트를 점유해야하므로 64으로 오른쪽으로 시프트하면 항상 숫자가 0이됩니다.비트가 오른쪽으로 오랫동안 0이 아닌 길이로 시프트 되었습니까?

scala> 64 >> 64 
res22: Int = 64 

scala> 64 >> 65 
res23: Int = 32 

scala> 64 >> 66 
res24: Int = 16 

scala> 64 >> 67 
res25: Int = 8 

scala> 64 >> 68 
res26: Int = 4 

scala> 64 >> 69 
res27: Int = 2 

scala> 64 >> 70 
res28: Int = 1 

scala> 64 >> 71 
res29: Int = 0 

scala> 64 >>> 64 
res30: Int = 64 

scala> 64 >>> 65 
res31: Int = 32 

스칼라에서는 어떤 동작이 발생합니까?

+0

'Long'값에 대해서는 물어 보지만 예제에서는 'Int'를 사용합니다. 질문을 명확히 할 수 있습니까? –

+0

동작은 관계없이 동일하게 나타납니다? 나는 scala 2.11.7을 사용하고있다. fwiw –

+0

같은 어쨌든'scala> 64l >> 64l = 64' – prayagupd

답변

3

스칼라는 오른손을 취하여 왼쪽 피연산자의 단어 크기를 모듈로 적용합니다. 당신이 (7 ~ 31)에 의해 오른쪽 시프트에있는 64 바이너리는 1000000입니다

scala> 64 >> 64 
res0: Int = 64 

scala> 64 >> 1 
res1: Int = 32 

scala> 64 >> 32 
res2: Int = 64 

scala> 8 >> 32 
res3: Int = 8 

scala> 8 >> 64 
res4: Int = 8 

scala> 8 >> 128 
res5: Int = 8 

scala> 64L >> 64 
res6: Long = 64 

scala> 64L >> 32 
res7: Long = 0 
+1

흠, 이것은 스칼라에 고유 한 것인가, 아니면 Java에서의 같은 행동인가? 나는 이것을 모른다. –

+0

@ChrisStewart Java는 동일하다. 스칼라 버전이 Java 기능 만 사용하고있는 것은 좋지만 잘 모르겠습니다. – puhlen

0

,

0을 얻기 위해 당신은 32, 64 및 128의 오른쪽 값을 사용하여 Int에 대해 동일한 결과를 얻을 수 .

scala> import java.lang.Long 
import java.lang.Long 

scala> Long.toBinaryString(64) 
res139: String = 1000000 

scala> Long.toBinaryString(64 >> 6) 
res140: String = 1 

scala> Long.toBinaryString(64 >> 7) 
res141: String = 0 

31+는 당신에게 동일한 결과를 줄 것이다

scala> 64 >> 64 
res1: Int = 64 

scala> 64 >> 32 
res2: Int = 64 

scala> 64 >> 128 
res3: Int = 64 

동일 함 java.lang.Long 또는 scala.Long

관련 문제