bitnot function
Implementation
BigInt bitnot(BigInt bn, {int? bitLength}) {
// JavaScript's bitwise not doesn't work on negative BigInts (bn = ~bn; // WRONG!)
// so we manually implement our own two's compliment (flip bits, add one)
bn = -bn;
String bin = bn.toRadixString(2).replaceAll('-', '');
String prefix = '';
while (bin.length % 8 != 0) {
bin = '0$bin';
}
if ('1' == bin[0] && bin.substring(1).contains('1')) {
prefix = '1' * 8;
}
if (bitLength != null && bitLength > 0 && bitLength > bin.length) {
prefix = '1' * (bitLength - bin.length);
}
bin = bin.split('').map((i) {
return '0' == i ? '1' : '0';
}).join();
return BigInt.parse(prefix + bin, radix: 2) + BigInt.one;
}