Added bitwise operations to BigNumber (#781).

This commit is contained in:
Richard Moore 2020-04-15 15:39:26 -04:00
parent 220e0710a9
commit 7498c18235
No known key found for this signature in database
GPG Key ID: 665176BE8E9DC651
2 changed files with 60 additions and 3 deletions

@ -89,17 +89,62 @@ export class BigNumber implements Hexable {
} }
mod(other: BigNumberish): BigNumber { mod(other: BigNumberish): BigNumber {
return toBigNumber(toBN(this).mod(toBN(other))); const value = toBN(other);
if (value.isNeg()) {
throwFault("cannot modulo negative values", "mod");
}
return toBigNumber(toBN(this).umod(value));
} }
pow(other: BigNumberish): BigNumber { pow(other: BigNumberish): BigNumber {
return toBigNumber(toBN(this).pow(toBN(other))); return toBigNumber(toBN(this).pow(toBN(other)));
} }
maskn(value: number): BigNumber { and(other: BigNumberish): BigNumber {
const value = toBN(other);
if (this.isNegative() || value.isNeg()) {
throwFault("cannot 'and' negative values", "and");
}
return toBigNumber(toBN(this).and(value));
}
or(other: BigNumberish): BigNumber {
const value = toBN(other);
if (this.isNegative() || value.isNeg()) {
throwFault("cannot 'or' negative values", "or");
}
return toBigNumber(toBN(this).or(value));
}
xor(other: BigNumberish): BigNumber {
const value = toBN(other);
if (this.isNegative() || value.isNeg()) {
throwFault("cannot 'xor' negative values", "xor");
}
return toBigNumber(toBN(this).xor(value));
}
mask(value: number): BigNumber {
if (this.isNegative() || value < 0) {
throwFault("cannot mask negative values", "mask");
}
return toBigNumber(toBN(this).maskn(value)); return toBigNumber(toBN(this).maskn(value));
} }
shl(value: number): BigNumber {
if (this.isNegative() || value < 0) {
throwFault("cannot shift negative values", "shl");
}
return toBigNumber(toBN(this).shln(value));
}
shr(value: number): BigNumber {
if (this.isNegative() || value < 0) {
throwFault("cannot shift negative values", "shr");
}
return toBigNumber(toBN(this).shrn(value));
}
eq(other: BigNumberish): boolean { eq(other: BigNumberish): boolean {
return toBN(this).eq(toBN(other)); return toBN(this).eq(toBN(other));
} }
@ -120,6 +165,10 @@ export class BigNumber implements Hexable {
return toBN(this).gte(toBN(other)); return toBN(this).gte(toBN(other));
} }
isNegative(): boolean {
return (this._hex[0] === "-");
}
isZero(): boolean { isZero(): boolean {
return toBN(this).isZero(); return toBN(this).isZero();
} }

@ -9,7 +9,7 @@ declare module "bn.js" {
mul(other: BN): BN; mul(other: BN): BN;
pow(other: BN): BN; pow(other: BN): BN;
maskn(other: number): BN; umod(other: BN): BN;
eq(other: BN): boolean; eq(other: BN): boolean;
lt(other: BN): boolean; lt(other: BN): boolean;
@ -17,11 +17,19 @@ declare module "bn.js" {
gt(other: BN): boolean; gt(other: BN): boolean;
gte(other: BN): boolean; gte(other: BN): boolean;
isNeg(): boolean;
isZero(): boolean; isZero(): boolean;
toTwos(other: number): BN; toTwos(other: number): BN;
fromTwos(other: number): BN; fromTwos(other: number): BN;
or(other: BN): BN;
and(other: BN): BN;
xor(other: BN): BN;
shln(other: number): BN;
shrn(other: number): BN;
maskn(other: number): BN;
toString(radix: number): string; toString(radix: number): string;
toNumber(): number; toNumber(): number;
toArray(endian: string, width: number): Uint8Array; toArray(endian: string, width: number): Uint8Array;