J'ai cette déclaration:
Supposons que la valeur binaire de l'octet
x
vaut 00101011. Quel est le résultat dex>>2
?
Comment puis-je le programmer et quelqu'un peut-il m'expliquer ce qui se passe?
Premièrement, vous pouvez pas décaler un byte
en Java, vous pouvez uniquement décaler un int
ou un long
. Ainsi, le byte
fera l'objet d'une promotion en premier, par exemple.
00101011
-> 00000000000000000000000000101011
ou
11010100
-> 11111111111111111111111111010100
À présent, x >> N
_ signifie (si vous l’affiche sous forme de chaîne de chiffres binaires):
00000000000000000000000000101011 >> 2
-> 00000000000000000000000000001010
11111111111111111111111111010100 >> 2
-> 11111111111111111111111111110101
Les 32 bits binaires pour 00101011
est
00000000 00000000 00000000 00101011
, et le résultat est:
00000000 00000000 00000000 00101011 >> 2(times)
\\ \\
00000000 00000000 00000000 00001010
Décale les bits de 43 à droite de la distance 2; se remplit avec le bit le plus élevé (signe) sur le côté gauche.
Le résultat est 00001010 avec la valeur décimale 10.
00001010
8+2 = 10
Lorsque vous décalez de 2 bits vers la droite, vous supprimez les 2 bits les moins significatifs. Alors:
x = 00101011
x >> 2
// now (notice the 2 new 0's on the left of the byte)
x = 00001010
C'est essentiellement la même chose que de diviser un int par 2, 2 fois.
en Java
byte b = (byte) 16;
b = b >> 2;
// prints 4
System.out.println(b);
Ces exemples couvrent les trois types de déplacements appliqués à la fois à un nombre positif et à un nombre négatif:
// Signed left shift on 626348975
00100101010101010101001110101111 is 626348975
01001010101010101010011101011110 is 1252697950 after << 1
10010101010101010100111010111100 is -1789571396 after << 2
00101010101010101001110101111000 is 715824504 after << 3
// Signed left shift on -552270512
11011111000101010000010101010000 is -552270512
10111110001010100000101010100000 is -1104541024 after << 1
01111100010101000001010101000000 is 2085885248 after << 2
11111000101010000010101010000000 is -123196800 after << 3
// Signed right shift on 626348975
00100101010101010101001110101111 is 626348975
00010010101010101010100111010111 is 313174487 after >> 1
00001001010101010101010011101011 is 156587243 after >> 2
00000100101010101010101001110101 is 78293621 after >> 3
// Signed right shift on -552270512
11011111000101010000010101010000 is -552270512
11101111100010101000001010101000 is -276135256 after >> 1
11110111110001010100000101010100 is -138067628 after >> 2
11111011111000101010000010101010 is -69033814 after >> 3
// Unsigned right shift on 626348975
00100101010101010101001110101111 is 626348975
00010010101010101010100111010111 is 313174487 after >>> 1
00001001010101010101010011101011 is 156587243 after >>> 2
00000100101010101010101001110101 is 78293621 after >>> 3
// Unsigned right shift on -552270512
11011111000101010000010101010000 is -552270512
01101111100010101000001010101000 is 1871348392 after >>> 1
00110111110001010100000101010100 is 935674196 after >>> 2
00011011111000101010000010101010 is 467837098 after >>> 3
>>
est l’opérateur Arithmetic Right Shift. Tous les bits du premier opérande sont décalés du nombre de places indiqué par le deuxième opérande. Les bits les plus à gauche du résultat ont la même valeur que le bit le plus à gauche du nombre d'origine. (C’est pour que les nombres négatifs restent négatifs.)
Voici votre cas spécifique:
00101011
001010 <-- Shifted twice to the right (rightmost bits dropped)
00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number)
public class Shift {
public static void main(String[] args) {
Byte b = Byte.parseByte("00101011",2);
System.out.println(b);
byte val = b.byteValue();
Byte shifted = new Byte((byte) (val >> 2));
System.out.println(shifted);
// often overloked are the methods of Integer
int i = Integer.parseInt("00101011",2);
System.out.println( Integer.toBinaryString(i));
i >>= 2;
System.out.println( Integer.toBinaryString(i));
}
}
Sortie:
43
10
101011
1010
Vous pouvez utiliser par exemple cette API si vous souhaitez voir la présentation de vos numéros par bitString. mathématiques peu communes
Exemple (en jubile)
bitString = org.uncommons.maths.binary.BitString.new(Java.math.BigInteger.new("12").toString(2))
bitString.setBit(1, true)
bitString.toNumber => 14
edit : lien API modifié et ajout d'un petit exemple
byte x = 51; //00101011
byte y = (byte) (x >> 2); //00001010 aka Base(10) 10
Vous ne pouvez pas écrire de littéraux binaires comme 00101011
in Java afin que vous puissiez l'écrire au format hexadécimal à la place:
byte x = 0x2b;
Pour calculer le résultat de x >> 2
vous pouvez alors écrire exactement cela et imprimer le résultat.
System.out.println(x >> 2);
00101011 = 43 en décimal
class test {
public static void main(String[] args){
int a= 43;
String b= Integer.toBinaryString(a >> 2);
System.out.println(b);
}
}
Sortie:
101011 devient 1010