【问题标题】:how to replicate javascript bit-shift, bit-wise operations in java,如何在java中复制javascript位移,按位运算符,
【发布时间】:2011-12-15 04:53:54
【问题描述】:

我正在尝试在 java 中复制 javascript 位移和按位操作的行为。

您以前有没有尝试过这样做,即使是多头,您如何才能可靠且始终如一地做到这一点?

  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中?

【问题讨论】:

  • 我不确定您的实际问题是什么? Java 以与 Javascript 类似的方式支持位移和按位操作(例如 has & ? > >>> 等)。你到底有什么问题?
  • ya 它相似,直到它达到整数最大值和 long 之间的边界。我正在尝试将一些 javascript 转换为 java,并且非常难以匹配位移操作。 Javascript 将移位操作数中的所有内容转换为 32 位整数。在 javascript 中: var zz=123456789123
  • 所以您的意思是您想在 Java 中复制这种不良行为? o_O
  • 绝对是我。无论是否可取,我都需要将 javascript 代码翻译成 java。我这里放不下代码,所以把它贴在上面。

标签: java javascript bit-manipulation bit-shift


【解决方案1】:

是的。 Java 有bit-wise operatorsshift operators

您有什么特别想问的吗?

编辑:啊,在转换之前转换为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));
   }

【讨论】:

    【解决方案2】:

    Java 具有大致相同的按位运算符。不过还是有细微差别的。

    Java 的 int 类型是 32 位有符号的,而 JavaScript 的 &gt;&gt;&gt; 运算符返回一个 32 位 无符号 整数值,因此以下

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

    生产

    "2147483648"
    

    在 JavaScript 中,但产生相同的表达式

    "-2147483648"
    

    在 Java 中。

    Java 的 long 类型将让您获得复制 JavaScript 位操作所需的所有精度,但您需要确保在使用 &gt;&gt;&gt; 时将其屏蔽为 32 个有符号位,其中移位量可能为 0(或32 的倍数)。

    你可以通过做得到long的低32位

    (myLong & 0xffffffffL)
    

    【讨论】:

      【解决方案3】:

      将移位和加法操作从 javascript 转换为 java 的一种方法是使用 int 强制转换隔离移位操作的操作数,并使用长强制转换隔离加法/减法操作的操作数(因为 java 将强制转换超过2 bil 到一个没有它们的 int,并且 javascript 会自动将位转换中的 long 转换为 int,而 java 不会:

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

      【讨论】:

        猜你喜欢
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 2012-09-06
        • 1970-01-01
        • 2013-01-25
        相关资源
        最近更新 更多