web-dev-qa-db-fra.com

Opérateur Shift '>>>' non signé à droite dans Java

Duplicata possible:
Pourquoi (-1 >>> 32 -1?) ==

L'opérateur de décalage vers la droite non signé insère un 0 dans l'extrême gauche. Alors quand je fais

System.out.println(Integer.toBinaryString(-1>>>30))

sortie

11

Par conséquent, il insère 0 dans le bit le plus à gauche.

System.out.println(Integer.toBinaryString(-1>>>32))

sortie

11111111111111111111111111111111

Cela ne devrait-il pas être 0?

34
Sashwat

Voir http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19

Si le type promu de l'opérande de gauche est int, seuls les cinq bits de poids faible de l'opérande de droite sont utilisés comme distance de décalage. C'est comme si l'opérande de droite était soumis à un opérateur ET logique au niveau du bit & (§15.22.1) avec la valeur de masque 0x1f (0b11111). La distance de décalage effectivement utilisée est donc toujours comprise entre 0 et 31 inclus.

c'est -1 >>> 32 est équivalent à -1 >>> 0 et -1 >>> 33 est équivalent à -1 >>> 1 et, surtout déroutant, -1 >>> -1 est équivalent à -1 >>> 31

48
Evgeniy Dorofeev