有什么办法可以在JS中读取浮点值的字节吗?我需要的是将原始FLOAT或DOUBLE值写入我需要制作的二进制格式,那么有没有办法获得逐字节的IEEE 754表示?当然,同样的写作问题.
Javascript根据规范将所有数字存储为双精度64位格式IEEE 754值:
Number类型具有18437736874454810627(即2 64 -2 53 +3)个值,表示IEEE标准二进制浮点运算中指定的双精度64位格式IEEE 754值
有没有办法在Javascript中查看此表单中的数字?
在其他可以代表64位整数的语言中,可以很容易地做到这一点......
// convert 64-bit n to two 32-bit x and y
x = (n & 0xFFFFFFFF00000000) >> 32
y = n & 0xFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
但JavaScript不能代表64位整数.它只能代表52位整数而不会出现问题.
现在这意味着无法将64位整数转换为两个32位整数,因为它甚至不可能首先具有64位整数.
但是,我们还有52位.我的问题是:如何在JavaScript中将这个52位整数分成两个32位整数(20个高位和32个低位)
有人建议像上面的位操作代码在JavaScript中进行20位和32位拆分吗?
我从这里找到了一个代码,它将 Javascript 数字转换为内部 IEEE 表示,作为两个 Uint32 值:
function DoubleToIEEE(f)
{
var buf = new ArrayBuffer(8);
(new Float64Array(buf))[0] = f;
return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
}
Run Code Online (Sandbox Code Playgroud)
如何将返回值转换回 Javascript 数字?这边走:
var number = -10.3245535;
var ieee = DoubleToIEEE(number)
var number_again = IEEEtoDouble(ieee);
// number and number_again should be the same (if ever possible)
Run Code Online (Sandbox Code Playgroud) 以下代码是我对相当通用的 javascript 哈希代码实现的尝试。我计划将此代码与哈希表实现(例如 jshashtable)结合使用,该哈希表实现使用 hashCode() (如果它是为键定义的)。我尝试严格遵守 java 的数字、字符串和数组的哈希码实现。
问题:
注意:我知道下面的代码可以利用其他库,例如下划线和 jquery,但我不希望在我的实现中使用任何第三方依赖。这并不是说我对哈希代码库不感兴趣,它们本身可能依赖于 jquery、下划线等。
/**
* Computes a hash code for an object based on a given subset of its fields
* @param obj any type
* @param keys an array of strings representing some subset of the keys in obj or undefined
* @returns {Number} a java-like hash code for obj based on the hash codes of a subset of its fields …Run Code Online (Sandbox Code Playgroud) 嗨,我需要函数来计算从数字(实数双精度)和整数的唯一整数.
尝试解释我正在开发javascript中的GIS应用程序,我正在使用复杂的矢量对象,如polygon(点对象数组,环中有两个坐标)和点数组.我需要快速算法来识别元素已被更改它必须非常快,因为我的矢量对象是千点的集合.在C#中,我使用按位运算XOR从坐标计算哈希码.
但是javascript将按位运算中的所有操作数转换为整数,但我需要在c#way(binnary)中按位置应用之前将双精度转换为整数.在反射器中,我看到c#计算哈希码这样的双倍,我需要这个函数在javascript中尽可能快.
public override unsafe int GetHashCode() //from System.Double
{
double num = this;
if (num == 0.0)
{
return 0;
}
long num2 = *((long*) &num);
return (((int) num2) ^ ((int) (num2 >> 32)));
}
Run Code Online (Sandbox Code Playgroud)
例:
var rotation = function (n) {
n = (n >> 1) | ((n & 0x001) << 31);
return n;
}
var x: number = 1;
var y: number = 5;
var hash = x ^ rotation(y); // result is -2147483645
var x1: …Run Code Online (Sandbox Code Playgroud)