J'essaie de reproduire le comportement des opérations de décalage de bit javascript et bit -wise en java.

Avez-vous déjà essayé de le faire auparavant, et comment pouvez-vous le faire de manière fiable et cohérente même avec des longs?

  var i=[some array with large integers];
  for(var x=0;x<100;x++)
  {
    var a=a large integer;

    var z=some 'long'>2.1 billion;
    //EDIT:
    z=i[x]+=(z>>>5)^(a<<2))+((z<<4)^(a<<5));

  }

Que feriez-vous pour mettre cela en java?

2
Sam Adamsh 15 déc. 2011 à 08:53

3 réponses

Meilleure réponse

Une façon de traduire les opérations de décalage de bits et d'addition de javascript à java est d'isoler les opérandes d'une opération de décalage de bits avec des transtypages int, et d'isoler les opérandes d'une opération d'addition / soustraction avec des transtypages longs (puisque java lancera une opération d'addition dépassant 2 bil à un int sans eux, et javascript convertit automatiquement les longs en bitshifts en ints, tandis que java ne le fait pas:

       long z=(long)(((int)z>>>5)^((int)a<<2))+(long)(((int)z<<4)^((int)a<<5)); 
0
Sam Adamsh 15 déc. 2011 à 22:29

Java a des opérateurs au niveau du bit qui se comportent globalement de la même manière. Il y a cependant une différence subtile.

Le type int de Java est signé 32 bits, tandis que l'opérateur >>> de JavaScript renvoie une valeur entière non signée 32 bits, donc ce qui suit

"" + ((1 << 31) >>> 0)

Produit

"2147483648"

En JavaScript mais la même expression produit

"-2147483648"

En Java.

Le type long de Java vous permettra d'obtenir toute la précision dont vous avez besoin pour répliquer la manipulation de bits JavaScript, mais vous devez vous assurer de le masquer à 32 bits signés lorsque vous utilisez >>> où la quantité de décalage peut être 0 (ou un multiple de 32).

Vous pouvez obtenir les 32 bits bas d'un long en faisant

(myLong & 0xffffffffL)
2
Mike Samuel 15 déc. 2011 à 22:40

Oui. Java a des opérateurs au niveau du bit et opérateurs de décalage.

Y a-t-il quelque chose en particulier que vous souhaitez demander?

Edit: Ah, il suffit de lancer un int avant de décaler.

int zz = ((int) 123456789123L) << 20;

Vous obtiendrez -1473249280 au moment où vous noterez que JavaScript vous donne.

Edit2: Voulez-vous juste quelque chose comme ça?

   long[] i=[some array with large integers];
   for(int x=0; x < 100; x++)
   {
     int a= (int) <a large integer>; // cast in case it's a long or something
     long z= <some 'long' gt 2.1 billion>;
     z=i[x]+=((int) z)>>>5)^(a<<2));
   }
2
jbindel 15 déc. 2011 à 06:00