D'accord au niveau du bit, donc j'ai 4 entiers Je veux envelopper dans une longue. Les 4 entiers tous contient 3 valeurs, positionnées dans les 2 premiers octets:Emballage 4 entiers dans un 64 peu long - java
+--------+--------+
|xxpppppp|hdcsrrrr|
+--------+--------+
{pppppp} représente une valeur, {HDCS} représente la deuxième et {} rrrr dernier.
Je veux emballer 4 de ces entiers, dans une longue. Je l'ai essayé ce qui suit:
ordinal = (c1.ordinal() << (14*3) | c2.ordinal() << (14*2) | c3.ordinal() << 14 | c4.ordinal());
où c1.ordinal() ... c4.ordinal() sont les entiers pour envelopper.
Cela ne semble pas fonctionner si je lance un test. Disons que je veux regarder les valeurs du dernier entier long, c4.ordinal()
, où {pppppp} = 41, {HDCS} = 8 et {rrrr} = 14, je reçois les résultats suivants:
System.out.println(c4.ordinal() & 0xf); //Prints 14
System.out.println(hand.ordinal() & 0xf); // Prints 14 - correct
System.out.println(c4.ordinal() >> 4 & 0xf); // Prints 8
System.out.println(hand.ordinal() >> 4 & 0xf); // Prints 8 - correct
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 61 - NOT correct!
Maintenant, ce qui suit est bizarre pour moi. Si je retire les deux premiers entiers, et seulement envelopper les deux derniers, comme ceci:
ordinal = (c3.ordinal() << 14 | c4.ordinal());
et exécutez le même test, j'obtenir le résultat correct:
System.out.println(c4.ordinal() >> 8 & 0x3f); // Prints 41
System.out.println(hand.ordinal() >> 8 & 0x3f); // Prints 41 - correct!
Je ne sais pas ce qui est erroné . Et cela n'a aucun sens pour moi, que j'obtiens la bonne réponse si j'enlève les deux premiers entiers. Je commence à penser que cela pourrait avoir à faire avec le type de données long, mais je n'ai encore rien trouvé, qui supporte cette théorie.
@Frederik: Pourquoi vous déplacez-vous par multiples de 14 et vous déplacez par multiples de 4? – Welbog
Parce que les deux derniers bits des valeurs de 16 bits, sera toujours 0, donc ils n'ont pas d'importance. 2 des 3 valeurs ont une longueur de 4 bits, donc je change de 4 à chaque fois. (Le dernier est long de 6 bits, donc j'ai besoin d'utiliser un autre masque pour cette valeur). –