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

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简易计算器实训报告】 Java简易计算器的实训项目旨在让学生深入理解和掌握Java编程语言,特别是面向对象编程技术。在这个项目中,学生需要设计并实现一个包含简易计算器和科学计算器功能的程序,以此来巩固和...

    javaEE网页版简易计算器(源码)

    在本项目中,"javaEE网页版简易计算器(源码)"是一个基于JavaEE平台的Web应用程序,旨在实现一个简单的在线计算器,支持2位数之间的基本数学运算,包括加法、减法、乘法和除法。这个项目利用了MyEclipse作为开发...

    简易计算器

    简易计算器是一种基础的计算工具,通常用于执行基本的数学运算,如加法、减法、乘法、除法以及一些扩展功能,例如开平方。在本文中,我们将深入探讨简易计算器的设计原理、实现方法和相关技术。 首先,设计一个简易...

    购物简易计算器

    【标题】"购物简易计算器" 是一个用于辅助计算购物消费的简单程序,它可能是通过编程语言实现的一个小程序或网页应用。这个程序的核心功能是帮助用户快速计算商品总价、优惠后的金额以及税费等与购物相关的费用。 ...

    jsp实现的简易计算器

    本篇将详细介绍如何利用JSP来创建一个简易计算器,这涉及到JSP基本语法、表单处理以及JavaScript的前端验证。 首先,我们需要理解JSP的基本结构。一个简单的JSP页面通常包含HTML标记、脚本元素(Scriptlets)、...

    实例43_简易计算器.ZIP

    在本实例中,我们讨论的是一个名为"简易计算器"的项目,它可能是一个基于文本界面或图形用户界面(GUI)的应用程序,用于执行基本的算术运算,如加、减、乘、除。这个"实例43_简易计算器.ZIP"文件包含了一个实现这种...

    677276187113413简易计算器.zip

    【标题】"677276187113413简易计算器.zip" 暗示我们讨论的主题是一款简易计算器的应用程序或者源代码,它被压缩在一个ZIP文件中。ZIP是一种常见的文件压缩格式,用于将多个文件或文件夹打包在一起,便于存储和传输。...

    javascripte一个简单的计算器

    【JavaScript简易计算器实现详解】 在本文中,我们将深入探讨如何使用JavaScript语言创建一个简单的计算器。这个计算器具有基本的数学运算功能,如加、减、乘、除,以及一些高级的数学函数,如正弦、余弦、反正弦、...

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

    这篇实验报告描述的是一个使用Java Swing开发的计算器项目,旨在教授学生如何构建图形用户界面(GUI)并处理事件。以下是该实验中涉及的关键知识点: 1. **Java Swing**: Swing是Java的一个图形用户界面库,用于...

    java实现的简单计算器程序

    ### Java实现的简单计算器程序详解 #### 知识点概览 本文将深入解析一个用Java编写的简单计算器程序,适合编程初学者理解和学习。该程序涵盖了Java的基础语法、Swing图形用户界面(GUI)组件的使用、事件监听器机制...

    611849114242719KEY_S0001简易计算器.zip

    标题 "611849114242719KEY_S0001简易计算器.zip" 暗示我们关注的是一款名为“简易计算器”的软件,它被压缩成一个ZIP文件以便于下载和存储。ZIP是一种常见的文件压缩格式,由Phil Katz在1989年开发,用于减少文件的...

    计算器_计算的_算起_简易计算器_

    在编程中,创建一个简易计算器是一个常见的学习任务,它可以帮助初学者理解基本的输入输出处理、变量赋值以及控制流程。本篇文章将详细探讨简易计算器的实现、相关编程概念以及它在不同语言中的应用。 1. **基本...

    10-简易计算器 万用板.zip

    标题中的“10-简易计算器 万用板.zip”表明这是一个关于创建简易计算器的项目,可能是一个电子工程或计算机编程的教程部分。由于没有具体的标签信息,我们可以从一般的角度来探讨计算器的工作原理、设计和实现。 ...

    可进行简单运算的简易计算器

    在开发此类应用时,开发者可能会选择使用各种编程语言,如Python、Java、C#或JavaScript等。对于移动设备,可能还会使用Swift(iOS)或Kotlin(Android)。开发过程中,测试是一个关键环节,确保计算器对各种可能的...

    简易计算器.zip

    【简易计算器.zip】是一个包含微信小程序模板的压缩文件,它为开发者提供了一个基础的计算器应用框架,便于快速构建自己的小程序项目。微信小程序是一种轻量级的应用形式,无需下载安装即可在微信内使用,大大提升了...

Global site tag (gtag.js) - Google Analytics