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))
11
Par conséquent, il insère 0 dans le bit le plus à gauche.
System.out.println(Integer.toBinaryString(-1>>>32))
11111111111111111111111111111111
Cela ne devrait-il pas être 0?
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