U128.js is a JavaScript library that provides 128-bit unsigned integer operations. It is designed to be compatible with various mainstream browsers.
Sample Code:
<script type="text/javascript" src="u128.js" ></script>
<script type="text/javascript">
/*
Namespace shorthand
*/
var u = faultylabs.u128;
/*
Conversions to/from hex string:
*/
var a = u.hexval("000000bbaaaaaaaa33333333ffffffff")
var astr = u.hex$(a)
alert( astr == "000000bbaaaaaaaa33333333ffffffff" )
/*
Addition a + b
*/
var a = u.hexval("1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
var b = u.hexval("0000000000000000000000000000001")
var c = u.add(a, b)
alert(u.hex$(c) == "02000000000000000000000000000000")
/*
Subtraction a - b
*/
var a = u.hexval("b0000000000000000000000000000000")
var b = u.hexval("00000000000000000000000000000001")
var c = u.sub(a, b)
alert(u.hex$(c) == "afffffffffffffffffffffffffffffff")
/*
Multiplication a * b
*/
var a = u.hexval("78cd2bbafbd21e3")
var b = u.hexval("de36a45d123b885")
var c = u.mul(a, b)
alert(u.hex$(c) == "0068dbb4c2baf8856f0df18732a6c2ef")
/*
Quotient a / b
*/
var a = u.hexval("0068dbb4c2baf8856f0df18732a6c2ef")
var b = u.hexval("de36a45d123b885")
var c = u.div(a, b)
alert(u.hex$(c) == "0000000000000000078cd2bbafbd21e3")
/*
Remainder a % b
*/
var a = u.hexval("00000521aaaaaaa76666666bfffffff9")
var b = u.hexval("00000521aaaaaaa00000000000000000")
var c = u.mod(a, b)
alert(u.hex$(c) == "00000000000000076666666bfffffff9")
/* Comparison of a and b
0 -> a == b
1 -> a > b
-1 -> a < b
*/
var a = u.hexval("de36a45d123b885")
var b = u.hexval("68dbb4c2baf8856f0df18732a6c2ef")
var cmp = u.cmp(a, b)
alert(cmp == -1)
/*
Binary AND a & b
Binary OR a | b
Binary XOR a ^ b
Binary NOT ~a
*/
var v55 = u.hexval("55555555555555555555555555555555")
var vAA = u.hexval("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
var vFF = u.hexval("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
var vOR = u.or (v55, vAA)
var vAND = u.and(vFF, v55)
var vXOR = u.xor(vFF, v55)
var vNOT = u.not(v55)
alert(u.hex$(vOR) == "ffffffffffffffffffffffffffffffff")
alert(u.hex$(vAND) == "55555555555555555555555555555555")
alert(u.hex$(vXOR) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
alert(u.hex$(vNOT) == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
/*
Left shift
*/
var a = u.hexval("00BBAAAAAAAA33333333FFFFFFFF")
var la = u.shl(a, 8)
alert(u.hex$(la) == "0000bbaaaaaaaa33333333ffffffff00")
/*
Right shift
*/
var a = u.hexval("0000BBAAAAAAAA33333333FFFFFFFF11")
var ra = u.shr(a, 8)
alert(u.hex$(ra) == "000000bbaaaaaaaa33333333ffffffff")
/*
Bit test
*/
var a = u.hexval("10000000000000000000000")
var bit = u.btest(a, 88)
alert(bit == 1)
/*
Shortcuts for the values 1 and 0
*/
var a = u.zero()
var b = u.one()
alert(
u.hex$(a) == "00000000000000000000000000000000" &&
u.hex$(b) == "00000000000000000000000000000001"
)
</script>