diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-02-14 21:36:59 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-02-14 21:36:59 -0500 |
commit | b16a890dc7e1435497a1b97b1a0fb7b0987faaef (patch) | |
tree | 93069e3ff4853e547a81b6a913eae1f6c84265f2 /src/parseTools.js | |
parent | 96a29d6e19bcd9617de7881d673f31a63e0728d6 (diff) |
parse negative iBig numbers
Diffstat (limited to 'src/parseTools.js')
-rw-r--r-- | src/parseTools.js | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/parseTools.js b/src/parseTools.js index 071ed090..b401c1a5 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -602,6 +602,22 @@ function parseArbitraryInt(str, bits) { } } + function mul2(v) { // v *= 2 + for (var i = v.length-1; i >= 0; i--) { + var d = v[i]*2; + r = d >= 10; + v[i] = d%10; + var j = i-1; + if (r) { + if (j < 0) { + v.unshift(1); + break; + } + v[j] += 0.5; // will be multiplied + } + } + } + function subtract(v, w) { // v -= w. we assume v >= w while (v.length > w.length) w.splice(0, 0, 0); for (var i = 0; i < v.length; i++) { @@ -631,9 +647,11 @@ function parseArbitraryInt(str, bits) { if (str[0] == '-') { // twos-complement is needed - assert(bits == 64, "we only support 64-bit two's complement so far"); str = str.substr(1); - v = str2vec('18446744073709551616'); // 2^64 + v = str2vec('1'); + for (var i = 0; i < bits; i++) { + mul2(v); + } subtract(v, str2vec(str)); } else { v = str2vec(str); |