All files / src/common twos-complement.ts

91.66% Statements 11/12
85.71% Branches 6/7
100% Functions 2/2
90.9% Lines 10/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2468x 68x   68x   25x             25x     17x     68x 14x 9x 14x    
const _0n = BigInt(0);
const _1n = BigInt(1);
 
export function toTwos(value: bigint, bitlength: string | number = 128) {
  // make sure its in range given the number of bits
  Iif (
    value < -(_1n << (BigInt(bitlength) - _1n)) ||
    value > (_1n << (BigInt(bitlength) - _1n)) - _1n
  )
    throw `Integer out of range given ${bitlength} bits to represent.`;
 
  // if positive, return the positive value
  if (value >= _0n) return value;
 
  // if negative, convert to twos complement representation
  return ~((-value - _1n) | ~((_1n << BigInt(bitlength)) - _1n));
}
 
export function fromTwos(value: bigint, bitlength: string | number = 128) {
  if ((value & (_1n << (BigInt(bitlength) - _1n))) > _0n)
    value = value - (_1n << BigInt(bitlength));
  return value;
}