`
peter.xu.1984.cn
  • 浏览: 5974 次
文章分类
社区版块
存档分类
最新评论

java, js 96位简易计算器

阅读更多

 

为了保证各个平台上的计算结果一致,花了近一个星期,总算摸清楚Chrome,IE,和JRE的脾气了。

Chrome最大气,就算结果超出容器范围,也会自动丢弃溢出的数据,保证范围内的数据正确。而且只要运行在64位系统上,自动支持64位整型。IE最渣,64位整型非要64位IE也就算了,Ajax控制器老喜欢没事Cache,也不管别人更新了没有,Ctrl F5都没用,尼玛非要在URL里加个随机UID来强制刷新。

JRE最坑爹的是,这么多年了,居然没人想到要支持unsigned整型......大概是没人会拿Java做高密度计算的原因吧,搞得int最大值其实只有31位......

于是,为了保证长~~~~~整型在各个平台上的计算都能在各自的安全范围内进行,参考U128自己写了个96位计算器。很简单,4个24位计算器连在一起,只有加法,移位和与或,U128里有乘法除法取余等等,但是懒得移植了......用来做Hash足够了。

 

 

var evergreenlabs = {};
evergreenlabs.u96 = {};

// Hex string to number
evergreenlabs.u96.hexval = function(n) {
  var r = new Array(4);
  n = "0000000000000000000000000000000" + n;
  n = n.slice(-24);
  r[3] = parseInt(n.substring(0, 6), 16);
  r[2] = parseInt(n.substring(6, 12), 16);
  r[1] = parseInt(n.substring(12, 18), 16);
  r[0] = parseInt(n.substring(18, 24), 16);
  return r;
};

// internal: array dup
evergreenlabs.u96._cloneArray = function(arr) {
  return arr.slice(0);
};

// Left shift
evergreenlabs.u96.shl = function(n, s) {
  var ns = evergreenlabs.u96._cloneArray(n);
  for (var i = 0; i
    ns[3] = ((ns[3]<<1) | ((ns[2]>>>23) & 1)) & 0xFFFFFF;
    ns[2] = ((ns[2]<<1) | ((ns[1]>>>23) & 1)) & 0xFFFFFF;
    ns[1] = ((ns[1]<<1) | ((ns[0]>>>23) & 1)) & 0xFFFFFF;
    ns[0] = (ns[0]<<1) & 0xFFFFFF;
  }
  return ns;
};

// Unsigned right shift
evergreenlabs.u96.shr = function(n, s) {
  var ns = evergreenlabs.u96._cloneArray(n);
  for (var i = 0; i
    ns[0] = ((ns[0]>>>1) | (ns[1]<<23 )) & 0xFFFFFF;
    ns[1] = ((ns[1]>>>1) | (ns[2]<<23 )) & 0xFFFFFF;
    ns[2] = ((ns[2]>>>1) | (ns[3]<<23 )) & 0xFFFFFF;
    ns[3] = (ns[3]>>>1) & 0xFFFFFF;
  }
  return ns;
};

// New u96 = 0
evergreenlabs.u96.zero = function() {
  return [0, 0, 0, 0];
};

// New u96 = 1
evergreenlabs.u96.one = function() {
  return [1, 0, 0, 0];
};

// Add
evergreenlabs.u96.add = function(n1, n2) {
  var retval = evergreenlabs.u96.zero();
  var carry = 0;
  for (var i = 0; i < 4; i++) {
    retval[i] = (0xFFFFFF & (n1[i] + n2[i] + carry)) >>>  0;
    if (evergreenlabs.u96._cmp32ABOVE(n1[i], retval[i])) {
      carry = 1;
    } else {
      carry = 0;
    }
  }
  return retval;
};

// Unsigned 32 bit comparison, true if n1 is above n2 
evergreenlabs.u96._cmp32ABOVE = function(n1, n2) {
  return (n1 >>> 0) > (n2 >>> 0);
};

// Binary XOR
evergreenlabs.u96.xor = function(n1, n2) {
  var retval = evergreenlabs.u96.zero();
  for (var i = 0; i < 4; i++) {
    retval[i] = (n1[i] ^ n2[i]) & 0xFFFFFF;
  }
  return retval;
};

 

 

 

public class U96 {

  // Hex string to number
  public static int[] hexval(String n) {
    int r[] = { 0, 0, 0, 0 };
    n = "0000000000000000000000000000000" + n;
    n = n.substring(n.length() - 24);
    r[3] = Integer.parseInt(n.substring(0, 6), 16);
    r[2] = Integer.parseInt(n.substring(6, 12), 16);
    r[1] = Integer.parseInt(n.substring(12, 18), 16);
    r[0] = Integer.parseInt(n.substring(18, 24), 16);
    return r;
  }

  // longernal: array dup
  public static int[] _cloneArray(int arr[]) {
    return arr.clone();
  }

  // Left shift
  public static int[] shl(int n[], int s) {
    int ns[] = _cloneArray(n);
    for (int i = 0; i < s; i++) {
      ns[3] = (ns[3] << 1) | ((ns[2] >>> 23) & 1) & 0xFFFFFF;
      ns[2] = (ns[2] << 1) | ((ns[1] >>> 23) & 1) & 0xFFFFFF;
      ns[1] = (ns[1] << 1) | ((ns[0] >>> 23) & 1) & 0xFFFFFF;
      ns[0] = (ns[0] << 1)  & 0xFFFFFF;
    }
    return ns;
  }

  // Unsigned right shift
  public static int[] shr(int n[], int s) {
    int ns[] = _cloneArray(n);
    for (int i = 0; i < s; i++) {
      ns[0] = ((ns[0] >>> 1) | (ns[1] << 23)) & 0xFFFFFF;
      ns[1] = ((ns[1] >>> 1) | (ns[2] << 23)) & 0xFFFFFF;
      ns[2] = ((ns[2] >>> 1) | (ns[3] << 23)) & 0xFFFFFF;
      ns[3] = (ns[3] >>> 1) & 0xFFFFFF;
    }
    return ns;
  }

  // New u128 = 0
  public static int[] zero() {
    int ret[] = { 0, 0, 0, 0 };
    return ret;
  }

  // New u128 = 1
  public static int[] one() {
    int ret[] = { 1, 0, 0, 0 };
    return ret;
  }



  // Add
  public static int[] add(int n1[], int n2[]) {
    int retval[] = zero();
    int carry = 0;
    for (int i = 0; i < 4; i++) {
      retval[i] = (0xFFFFFF & (n1[i] + n2[i] + carry)) >>> 0;
      if (_cmp32ABOVE(n1[i], retval[i])) {
        carry = 1;
      } else {
        carry = 0;
      }
    }
    return retval;
  }

  // Unsigned 32 bit comparison, true if n1 is above n2
  public static boolean _cmp32ABOVE(int n1, int n2) {
    return (n1 >>> 0) > (n2 >>> 0);
  }

  // Binary XOR
  public static int[] xor(int n1[], int n2[]) {
    int retval[] = zero();
    for (int i = 0; i < 4; i++) {
      retval[i] = (n1[i] ^ n2[i]) & 0xFFFFFF;
    }
    return retval;
  }
}
 

 

 

 

2
2
分享到:
评论

相关推荐

    简易计算器java实训报告.pdf

    简易计算器java实训报告.pdf

    java简易计算器实训报告.docx

    java简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易计算器实训报告.docxjava简易...

    Java计算器实验报告(1).doc

    大连民族大学 计算机科学与工程学院 《Java语言》课程实验报告 实验题目: 计算器的设计与实现 课程名称: Java语言 实验类型: 演示性 验证性 操作性 设计性 综合性 专业:网络工程 班级:**** 学生姓名*** 学号:*...

    javascripte一个简单的计算器

    用javascripte制作的简单的计算器,有效果图,功能齐全

    javascript实现简易计算器的代码

    今天闲来无聊,想写点什么,突然想到用javascript写一个计算器。程序还存在很多的Bug,先在这里记录一下,以后慢慢更正。 代码如下: &lt;!DOCTYPE ...

    javascript实现简易计算器功能

    本文实例为大家分享了javascript实现简易计算器的具体代码,供大家参考,具体内容如下 功能: 1、实现单击数字按钮输入数字 2、实现基础四则运算功能,并添加必要的异常处理,例如:除数不能为零 3、实现小数点添加...

    简易计算器.rar

    资源内容:项目全套源码+完整文档 ...后台框架代码:java/c/c++/php/VB/lun/Andorid/Python 开发环境:idea 数据库:MySql(建议用 5.7,8.0 有时候会有坑) 部署环境:Tomcat(建议用 7.x 或者 8.x b版本),maven 

    javascript实现简易计算器

    简易加减乘除计算器,利用表单的value值取值,用原生js实现.可直接复制到编辑器,打开即可运行. &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;加减乘除计算器&lt;/...

    javascript编写简易计算器

    本文实例为大家分享了js简易计算器的具体代码,供大家参考,具体内容如下 代码如下 &lt;!DOCTYPE html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;meta charset=UTF-8&gt; &lt;title&gt;简易计算器&lt;/title&gt; ...

    超漂亮JS网页计算器

    超漂亮JS网页计算器,用js实现了加减乘除运算的计算器代码,界面漂亮,功能方面只实现了最基础的基本计算功能,在火狐或Chrome下有更美观的表现,本代码只是介绍你一种用JS实现计算器的方法,若要更复杂的计算,只...

    工具-简易计算器.zip

    我们还使用了Vue.js作为前端开发框架,它提供了一种简洁而灵活的方式来构建交互式界面。 此外,我们的小程序项目源码还注重用户体验和界面设计。我们提供了一系列的界面模板和样式库,使得开发人员可以轻松创建漂亮...

    使用HTML5、CSS3和JavaScript实现简易四则运算

    使用HTML5、CSS3和JavaScript实现加、减、乘、除四个基本算术运算操作。

    javascript实现简易的计算器

    利用javascript实现简易的计算器,供大家参考,具体内容如下 1、先构思整个计算器的模式以及想要实现的功能,按模块创建相应的div,在“head”中设置其样式和布局。 2、用“input”标签创建text类型,置为输出框;...

    简易计算器.zip(小程序+JAVA+2024+最新+毕业设计+源码+PPT+Lw+使用说明+部署简单+操作简单+上手简单+系统

    (小程序+JAVA+2024+最新+毕业设计+源码+PPT+Lw+使用说明+部署简单+操作简单+上手简单+系统) 微信小程序是一种轻量级的应用程序,旨在提供简洁、快速的用户服务和体验。与传统的手机应用相比,小程序无需下载安装,...

    简单计算器:使用html,css和JavaScript

    简单计算器:使用html,css和JavaScript

    基于JSP实现一个简单计算器的方法

    本文实例讲述了基于JSP实现一个简单计算器的方法。分享给大家供大家参考。具体实现方法如下: index.jsp 代码如下:&lt;&#37;@ page language=”java” import=”java.util.*” pageEncoding=”GB18030″%&gt;  &lt;&#...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包101

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics