Report a bug
If you spot a problem with this page, click here to create a GitHub issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
mir.bignum.fixed
Note The module doesn't provide full arithmetic API for now.
- struct
UInt(size_t size) if (size % (size_t.sizeof * 8) == 0 && (size >= size_t.sizeof * 8)); - Fixed-length unsigned integer.Parameters:
size size in bits - size_t[size / (size_t.sizeof * 8)]
data; - Payload. The data is located in the target endianness.
- this(size_t N)(auto ref const size_t[N]
data)
if (N <= this.data.length); - this(size_t argSize)(auto ref const UInt!argSize
arg)
if (argSize <= size); - this()(auto ref const ulong[
data.length / 2]data); - this(ulong
data); - this(uint
data); - pure @nogc @safe this(C)(scope const(C)[]
str)
if (isSomeChar!C); - Examples:
import mir.math.constant: PI; UInt!256 integer = "34010447314490204552169750449563978034784726557588085989975288830070948234680"; // constructor assert(integer == UInt!256.fromHexString("4b313b23aa560e1b0985f89cbe6df5460860e39a64ba92b4abdd3ee77e4e05b8"));
- pure nothrow @nogc scope @trusted bool
fromStringImpl(C)(scope const(C)[]str)
if (isSomeChar!C); - Returns:false in case of overflow or incorrect string.
Precondition non-empty coefficients.
- const pure nothrow @safe immutable(C)[]
toString(C = char)()
if (isSomeChar!C && isMutable!C); - Examples:
auto str = "34010447314490204552169750449563978034784726557588085989975288830070948234680"; auto integer = UInt!256(str); assert(integer.toString == str); integer = UInt!256.init; assert(integer.toString == "0");
- const void
toString(C = char, W)(ref scope Ww)
if (isSomeChar!C && isMutable!C); - Examples:Check @nogc toString impl
import mir.format: stringBuf; auto str = "34010447314490204552169750449563978034784726557588085989975288830070948234680"; auto integer = UInt!256(str); stringBuf buffer; buffer << integer; assert(buffer.data == str, buffer.data);
- enum UInt!size
max; - enum UInt!size
min; - pure nothrow @nogc @property scope @safe BigUIntView!size_t
view()(); - const pure nothrow @nogc @property scope @safe BigUIntView!(const(size_t))
view()(); - UInt!size
fromHexString(bool allowUnderscores = false)(scope const(char)[]str); - pure nothrow @nogc @safe bool
fromHexStringImpl(C, bool allowUnderscores = false)(scope const(C)[]str)
if (isSomeChar!C); - UInt!size
fromBinaryString(bool allowUnderscores = false)(scope const(char)[]str); - pure nothrow @nogc @safe bool
fromBinaryStringImpl(C, bool allowUnderscores = false)(scope const(C)[]str)
if (isSomeChar!C); - const auto
opEquals(size_t rhsSize)(auto ref const UInt!rhsSizerhs);
const autoopEquals(ulongrhs); - const auto
opCmp(UInt!sizerhs);
const scope autoopCmp(ulongrhs); - pure nothrow @nogc ref scope @safe UInt!size
opAssign(ulongrhs) return; - pure nothrow @nogc scope @safe bool
opOpAssign(string op)(UInt!sizerhs, booloverflow= false)
if (op == "+" || op == "-");
pure nothrow @nogc scope @safe boolopOpAssign(string op)(size_trhs)
if (op == "+" || op == "-");
pure nothrow @nogc scope @safe boolopOpAssign(string op)(ulongrhs)
if (op == "+" || op == "-");
pure nothrow @nogc scope @safe boolopOpAssign(string op, size_t rsize)(UInt!rsizerhs, booloverflow= false)
if ((op == "+" || op == "-") && (rsize < size)); - bool
overflow= a += b and booloverflow= a -= b operations. - pure nothrow @nogc scope @safe size_t
opOpAssign(string op : "*")(size_trhs, size_tcarry= 0);
pure nothrow @nogc scope @safe autoopOpAssign(string op : "*")(ulongrhs); - Returns:overflow value of multiplication
- pure nothrow @nogc scope @safe void
opOpAssign(string op : "*", size_t rhsSize)(UInt!rhsSizerhs)
if (rhsSize <= size); - Returns:overflow value of multiplication
- pure nothrow @nogc scope @safe uint
opOpAssign(string op : "/")(uintrhs, uintoverflow= 0); - Performs uint remainder = (
overflow$big) /= scalar operatrion, where $ denotes big-endian concatenation.Precondition
overflow<rhsParameters:uint rhsunsigned value to devide by uint overflowinitial unsigned overflow Returns:unsigned remainder value (evaluated overflow) - nothrow ref UInt!size
opOpAssign(string op)(UInt!sizerhs) return
if (op == "^" || op == "|" || op == "&"); - Examples:
auto a = UInt!128.fromHexString("dfbbfae3cd0aff2714a1de7022b0029d"); auto b = UInt!128.fromHexString("e3251bacb112c88b71ad3f85a970a314"); assert((a.opBinary!"|"(b)) == UInt!128.fromHexString("ffbffbeffd1affaf75adfff5abf0a39d"));
- nothrow ref scope UInt!size
opOpAssign(string op)(size_trhs) return
if (op == "^" || op == "|" || op == "&");
pure nothrow @nogc ref scope @safe autoopOpAssign(string op)(ulongrhs) return
if (op == "^" || op == "|" || op == "&"); - pure nothrow @nogc ref @safe UInt!size
opOpAssign(string op)(size_tshift) return
if (op == "<<" || op == ">>"); - const pure nothrow @nogc @safe UInt!size
opBinary(string op)(size_trhs)
if (op == "<<" || op == ">>>" || op == ">>"); - auto c = a << b operation.Examples:
auto a = UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029d"); assert(a << 0 == a); assert(a << 4 == UInt!128.fromHexString("fbbfae3cd0aff2714a1de7022b0029d0")); assert(a << 68 == UInt!128.fromHexString("4a1de7022b0029d00000000000000000")); assert(a << 127 == UInt!128.fromHexString("80000000000000000000000000000000")); assert(a >> 0 == a); assert(a >> 4 == UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029")); assert(a >> 68 == UInt!128.fromHexString("afbbfae3cd0aff2")); assert(a >> 127 == UInt!128(1));
- template
opBinary(string op) if (op == "^" || op == "|" || op == "&" || op == "+" || op == "-" || op == "*")
templateopBinaryRight(string op) if (op == "^" || op == "|" || op == "&" || op == "+" || op == "*") - Binary operations
- const pure nothrow @nogc @safe UInt!size
opBinary(size_t rsize)(UInt!rsizerhs)
if (rsize <= size);
const pure nothrow @nogc @safe UInt!sizeopBinary(ulongrhs);
- const UInt!size
smallLeftShift()(uintshift); - Shifts left using at most size_t.sizeof * 8 - 1 bitsExamples:
auto a = UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029d"); assert(a.smallLeftShift(4) == UInt!128.fromHexString("fbbfae3cd0aff2714a1de7022b0029d0"));
- const UInt!size
smallRightShift()(uintshift); - Shifts right using at most size_t.sizeof * 8 - 1 bitsExamples:
auto a = UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029d"); assert(a.smallRightShift(4) == UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029"));
- const T
opCast(T)()
if (is(Unqual!T == bool)); - const T
opCast(T)()
if (is(Unqual!T == ulong)); - const T
opCast(T)()
if (is(Unqual!T == uint)); - const pure nothrow @nogc @safe UInt!newSize
toSize(size_t newSize, bool lowerBits = true)(); - Returns:the number with shrinked or extended size.
- const pure nothrow @nogc @safe UInt!(size + additionalRightBits)
rightExtend(size_t additionalRightBits)()
if (additionalRightBits); - const pure nothrow @nogc @safe bool
bt()(size_tposition); - Examples:
auto a = UInt!128.fromHexString("afbbfae3cd0aff2714a1de7022b0029d"); assert(a.bt(127) == 1); assert(a.bt(126) == 0); assert(a.bt(125) == 1); assert(a.bt(124) == 0); assert(a.bt(0) == 1); assert(a.bt(1) == 0); assert(a.bt(2) == 1); assert(a.bt(3) == 1);
- const pure nothrow @nogc @property @safe size_t
ctlz()(); - Examples:
auto a = UInt!128.fromHexString("dfbbfae3cd0aff2714a1de7022b0029d"); assert (a.ctlz == 0); a = UInt!128.init; assert (a.ctlz == 128); a = UInt!128.fromHexString("3"); assert (a.ctlz == 126);
- const pure nothrow @nogc @property @safe size_t
cttz()(); - Examples:
auto a = UInt!128.fromHexString("d"); assert (a.cttz == 0); a = UInt!128.init; assert (a.cttz == 128); a = UInt!128.fromHexString("300000000000000000"); assert (a.cttz == 68);
- const @property bool
signBit()();
@property voidsignBit()(boolvalue); - Examples:
auto a = UInt!128.fromHexString("dfbbfae3cd0aff2714a1de7022b0029d"); assert(a.signBit); a.signBit = false; assert(a == UInt!128.fromHexString("5fbbfae3cd0aff2714a1de7022b0029d")); assert(!a.signBit); a.signBit = true; assert(a == UInt!128.fromHexString("dfbbfae3cd0aff2714a1de7022b0029d"));
- UInt!sizeB
extendedMulHigh(size_t sizeA, size_t sizeB)(UInt!sizeAa, UInt!sizeBb); - @safe UInt!(sizeA + sizeB)
extendedMul(size_t sizeA, size_t sizeB)(UInt!sizeAa, UInt!sizeBb);
@safe UInt!(size + size_t.sizeof * 8)extendedMul(size_t size)(UInt!sizea, size_tb);
UInt!128extendedMul()(ulonga, ulongb);
UInt!64extendedMul()(uinta, uintb); - Examples:
auto a = UInt!128.max; auto b = UInt!256.max; auto c = UInt!384.max; assert(extendedMul(a, a) == UInt!256.max - UInt!128.max - UInt!128.max); assert(extendedMul(a, b) == UInt!384.max - UInt!128.max - UInt!256.max); assert(extendedMul(b, a) == UInt!384.max - UInt!128.max - UInt!256.max); a = UInt!128.fromHexString("dfbbfae3cd0aff2714a1de7022b0029d"); b = UInt!256.fromHexString("3fe48f2dc8aad570d037bc9b323fc0cfa312fcc2f63cb521bd8a4ca6157ef619"); c = UInt!384.fromHexString("37d7034b86e8d58a9fc564463fcedef9e2ad1126dd2c0f803e61c72852a9917ef74fa749e7936a9e4e224aeeaff91f55"); assert(extendedMul(a, b) == c); assert(extendedMul(b, a) == c); a = UInt!128.fromHexString("23edf5ff44ee3a4feafc652607aa1eb9"); b = UInt!256.fromHexString("d3d79144b8941fb50c9102e3251bacb112c88b71ad3f85a970a31458ce24297b"); c = UInt!384.fromHexString("1dbb62fe6ca5fed101068eda7222d6a9857633ecdfed37a2d156ff6309065ecc633f31465727677a93a7acbd1dac63e3"); assert(extendedMul(a, b) == c); assert(extendedMul(b, a) == c);
Examples:ulongulong a = 0xdfbbfae3cd0aff27; ulong b = 0x14a1de7022b0029d; auto c = UInt!128.fromHexString("120827399968ea2a2db185d16e8cc8eb"); assert(extendedMul(a, b) == c); assert(extendedMul(b, a) == c);
Examples:uintuint a = 0xdfbbfae3; uint b = 0xcd0aff27; auto c = UInt!64.fromHexString("b333243de8695595"); assert(extendedMul(a, b) == c); assert(extendedMul(b, a) == c);
- UInt!(size + size_t.sizeof * 8)
extendedMulAdd(size_t size)(UInt!sizea, size_tb, UInt!sizec);
Copyright © 2016-2022 by Ilya Yaroshenko | Page generated by
Ddoc on Tue Jan 11 06:37:06 2022