Из сообщения на форуме :
нет необходимости делать цифры маленькими, это только
важно сохранить количество значащих цифр ниже 53
function mult32s(n, m) //signed version
{
n |= 0;
m |= 0;
var nlo = n & 0xffff;
var nhi = n - nlo;
return ( (nhi * m | 0) + (nlo * m) ) | 0;
}
function mult32u(n, m) //unsigned version
{
n >>>= 0;
m >>>= 0;
var nlo = n & 0xffff;
var nhi = n - nlo;
return ( (nhi * m >>> 0) + (nlo * m) ) >>> 0;
}
Оба оператора |
и >>>
приводят к преобразованию результата в 32-разрядное целое число. В первом случае он преобразуется в целое число со знаком, во втором случае он преобразуется в целое число без знака.
В строке умножения первый оператор |
/ >>>
заставляет 64-битный промежуточный результат с 48-битным значением и (в форме 0x NNNN NNNN NNNN 0000
) отбрасывать свои старшие биты поэтому промежуточный результат имеет вид 0x NNNN 0000
.
Второй оператор |
/ >>>
приводит к тому, что результат второго умножения и сложения ограничивается 32 битами.
Если один из мультипликаторов является константой, вы можете еще больше упростить умножение:
function mult32s_with_constant(m) //signed version
{
m |= 0
//var n = 0x12345678;
var nlo = 0x00005678;
var nhi = 0x12340000;
return ( (nhi * m | 0) + (nlo * m) ) | 0;
}
Или, если вы знаете, что результат будет меньше 53 бит, тогда вы можете сделать просто:
function mult32s(n, m) //signed version
{
n |= 0;
m |= 0;
return ( n * m ) | 0;
}