как реплицировать бит-сдвиг JavaScript, побитовые операции в Java, - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь повторить поведение javascript бит-сдвига и побитовых операций в java.

Вы когда-нибудь пытались сделать это раньше, и как вы можете сделать это надежно и последовательно, даже с длинными?

  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));

  }

что бы вы сделали, чтобы поместить это в Java?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

В Java есть побитовые операторы, которые в целом ведут себя одинаково.Однако есть небольшая разница.

Тип Java int имеет 32-разрядную подпись, тогда как оператор JavaScript >>> возвращает 32-разрядное целое число без знака , поэтому следующее

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

производит

"2147483648"

в JavaScript, но то же выражение выдает

"-2147483648"

в Java.

Тип Java long позволит вамПолучите всю точность, необходимую для репликации манипуляций с битами JavaScript, но вы должны быть уверены, что замаскируете их до 32 битов со знаком при использовании >>>, где величина сдвига может быть 0 (или кратна 32).Вы можете получить 32 младших бита long, выполнив

(myLong & 0xffffffffL)
2 голосов
/ 15 декабря 2011

Да.В Java есть побитовые операторы и операторы сдвига .

Есть что-то конкретное, что вы хотите спросить?

edit: Ах, просто приведениедо int до перехода.

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

Вы получите -1473249280, как вы заметили, что JavaScript дает вам.

edit2: Вы просто хотите что-то подобное?

   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));
   }
0 голосов
/ 16 декабря 2011

Один из способов перевода операций сдвига и сложения битов из javascript в java состоит в том, чтобы изолировать операнды операции сдвига битов с помощью приведения типа int и изолировать операнды операции сложения / вычитания при длинных приведениях (поскольку java будет приводить операцию сложения, превышающую2 bil к int без них, и javascript автоматически преобразует long в битовых сдвигах в ints, а java -:

       long z=(long)(((int)z>>>5)^((int)a<<2))+(long)(((int)z<<4)^((int)a<<5)); 
...