Int16
Provides utility functions on 16-bit signed integers.
Note that most operations are available as built-in operators (e.g. 1 + 1
).
Import from the base library to use this module.
import Int16 "mo:base/Int16";
Type Int16
type Int16 = Prim.Types.Int16
16-bit signed integers.
Value minimumValue
let minimumValue : Int16
Minimum 16-bit integer value, -2 ** 15
.
Example:
Int16.minimumValue // => -32_768 : Int16
Value maximumValue
let maximumValue : Int16
Maximum 16-bit integer value, +2 ** 15 - 1
.
Example:
Int16.maximumValue // => +32_767 : Int16
Value toInt
let toInt : Int16 -> Int
Converts a 16-bit signed integer to a signed integer with infinite precision.
Example:
Int16.toInt(12_345) // => 12_345 : Int
Value fromInt
let fromInt : Int -> Int16
Converts a signed integer with infinite precision to a 16-bit signed integer.
Traps on overflow/underflow.
Example:
Int16.fromInt(12_345) // => +12_345 : Int16
Value fromIntWrap
let fromIntWrap : Int -> Int16
Converts a signed integer with infinite precision to a 16-bit signed integer.
Wraps on overflow/underflow.
Example:
Int16.fromIntWrap(-12_345) // => -12_345 : Int
Value fromInt8
let fromInt8 : Int8 -> Int16
Converts a 8-bit signed integer to a 16-bit signed integer.
Example:
Int16.fromInt8(-123) // => -123 : Int16
Value toInt8
let toInt8 : Int16 -> Int8
Converts a 16-bit signed integer to a 8-bit signed integer.
Traps on overflow/underflow.
Example:
Int16.toInt8(-123) // => -123 : Int8
Value fromInt32
let fromInt32 : Int32 -> Int16
Converts a 32-bit signed integer to a 16-bit signed integer.
Traps on overflow/underflow.
Example:
Int16.fromInt32(-12_345) // => -12_345 : Int16
Value toInt32
let toInt32 : Int16 -> Int32
Converts a 16-bit signed integer to a 32-bit signed integer.
Example:
Int16.toInt32(-12_345) // => -12_345 : Int32
Value fromNat16
let fromNat16 : Nat16 -> Int16
Converts an unsigned 16-bit integer to a signed 16-bit integer.
Wraps on overflow/underflow.
Example:
Int16.fromNat16(12_345) // => +12_345 : Int16
Value toNat16
let toNat16 : Int16 -> Nat16
Converts a signed 16-bit integer to an unsigned 16-bit integer.
Wraps on overflow/underflow.
Example:
Int16.toNat16(-1) // => 65_535 : Nat16 // underflow
Function toText
func toText(x : Int16) : Text
Returns the Text representation of x
. Textual representation do not
contain underscores to represent commas.
Example:
Int16.toText(-12345) // => "-12345"
Function abs
func abs(x : Int16) : Int16
Returns the absolute value of x
.
Traps when x == -2 ** 15
(the minimum Int16
value).
Example:
Int16.abs(-12345) // => +12_345
Function min
func min(x : Int16, y : Int16) : Int16
Returns the minimum of x
and y
.
Example:
Int16.min(+2, -3) // => -3
Function max
func max(x : Int16, y : Int16) : Int16
Returns the maximum of x
and y
.
Example:
Int16.max(+2, -3) // => +2
Function equal
func equal(x : Int16, y : Int16) : Bool
Equality function for Int16 types.
This is equivalent to x == y
.
Example:
Int16.equal(-1, -1); // => true
Note: The reason why this function is defined in this library (in addition
to the existing ==
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use ==
as a function value at the moment.
Example:
import Buffer "mo:base/Buffer";
let buffer1 = Buffer.Buffer<Int16>(1);
buffer1.add(-3);
let buffer2 = Buffer.Buffer<Int16>(1);
buffer2.add(-3);
Buffer.equal(buffer1, buffer2, Int16.equal) // => true
Function notEqual
func notEqual(x : Int16, y : Int16) : Bool
Inequality function for Int16 types.
This is equivalent to x != y
.
Example:
Int16.notEqual(-1, -2); // => true
Note: The reason why this function is defined in this library (in addition
to the existing !=
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use !=
as a function value at the moment.
Function less
func less(x : Int16, y : Int16) : Bool
"Less than" function for Int16 types.
This is equivalent to x < y
.
Example:
Int16.less(-2, 1); // => true
Note: The reason why this function is defined in this library (in addition
to the existing <
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use <
as a function value at the moment.
Function lessOrEqual
func lessOrEqual(x : Int16, y : Int16) : Bool
"Less than or equal" function for Int16 types.
This is equivalent to x <= y
.
Example:
Int16.lessOrEqual(-2, -2); // => true
Note: The reason why this function is defined in this library (in addition
to the existing <=
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use <=
as a function value at the moment.
Function greater
func greater(x : Int16, y : Int16) : Bool
"Greater than" function for Int16 types.
This is equivalent to x > y
.
Example:
Int16.greater(-2, 1); // => false
Function greaterOrEqual
func greaterOrEqual(x : Int16, y : Int16) : Bool
"Greater than or equal" function for Int16 types.
This is equivalent to x >= y
.
Example:
Int16.greaterOrEqual(-2, -2); // => true
Function compare
func compare(x : Int16, y : Int16) : {#less; #equal; #greater}
General-purpose comparison function for Int16
. Returns the Order
(
either #less
, #equal
, or #greater
) of comparing x
with y
.
Example:
Int16.compare(-3, 2) // => #less
This function can be used as value for a high order function, such as a sort function.
Example:
import Array "mo:base/Array";
Array.sort([1, -2, -3] : [Int16], Int16.compare) // => [-3, -2, 1]
Function neg
func neg(x : Int16) : Int16
Returns the negation of x
, -x
.
Traps on overflow, i.e. for neg(-2 ** 15)
.
Example:
Int16.neg(123) // => -123
Note: The reason why this function is defined in this library (in addition
to the existing -
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use -
as a function value at the moment.
Function add
func add(x : Int16, y : Int16) : Int16
Returns the sum of x
and y
, x + y
.
Traps on overflow/underflow.
Example:
Int16.add(100, 23) // => +123
Note: The reason why this function is defined in this library (in addition
to the existing +
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use +
as a function value at the moment.
Example:
import Array "mo:base/Array";
Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.add) // => -4
Function sub
func sub(x : Int16, y : Int16) : Int16
Returns the difference of x
and y
, x - y
.
Traps on overflow/underflow.
Example:
Int16.sub(123, 100) // => +23
Note: The reason why this function is defined in this library (in addition
to the existing -
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use -
as a function value at the moment.
Example:
import Array "mo:base/Array";
Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.sub) // => 4
Function mul
func mul(x : Int16, y : Int16) : Int16
Returns the product of x
and y
, x * y
.
Traps on overflow/underflow.
Example:
Int16.mul(12, 10) // => +120
Note: The reason why this function is defined in this library (in addition
to the existing *
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use *
as a function value at the moment.
Example:
import Array "mo:base/Array";
Array.foldLeft<Int16, Int16>([1, -2, -3], 1, Int16.mul) // => 6
Function div
func div(x : Int16, y : Int16) : Int16
Returns the signed integer division of x
by y
, x / y
.
Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.
Traps when y
is zero.
Example:
Int16.div(123, 10) // => +12
Note: The reason why this function is defined in this library (in addition
to the existing /
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use /
as a function value at the moment.
Function rem
func rem(x : Int16, y : Int16) : Int16
Returns the remainder of the signed integer division of x
by y
, x % y
,
which is defined as x - x / y * y
.
Traps when y
is zero.
Example:
Int16.rem(123, 10) // => +3
Note: The reason why this function is defined in this library (in addition
to the existing %
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use %
as a function value at the moment.
Function pow
func pow(x : Int16, y : Int16) : Int16
Returns x
to the power of y
, x ** y
.
Traps on overflow/underflow and when y < 0 or y >= 16
.
Example:
Int16.pow(2, 10) // => +1_024
Note: The reason why this function is defined in this library (in addition
to the existing **
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use **
as a function value at the moment.
Function bitnot
func bitnot(x : Int16) : Int16
Returns the bitwise negation of x
, ^x
.
Example:
Int16.bitnot(-256 /* 0xff00 */) // => +255 // 0xff
Note: The reason why this function is defined in this library (in addition
to the existing ^
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use ^
as a function value at the moment.
Function bitand
func bitand(x : Int16, y : Int16) : Int16
Returns the bitwise "and" of x
and y
, x & y
.
Example:
Int16.bitand(0x0fff, 0x00f0) // => +240 // 0xf0
Note: The reason why this function is defined in this library (in addition
to the existing &
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use &
as a function value at the moment.
Function bitor
func bitor(x : Int16, y : Int16) : Int16
Returns the bitwise "or" of x
and y
, x | y
.
Example:
Int16.bitor(0x0f0f, 0x00f0) // => +4_095 // 0x0fff
Note: The reason why this function is defined in this library (in addition
to the existing |
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use |
as a function value at the moment.
Function bitxor
func bitxor(x : Int16, y : Int16) : Int16
Returns the bitwise "exclusive or" of x
and y
, x ^ y
.
Example:
Int16.bitxor(0x0fff, 0x00f0) // => +3_855 // 0x0f0f
Note: The reason why this function is defined in this library (in addition
to the existing ^
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use ^
as a function value at the moment.
Function bitshiftLeft
func bitshiftLeft(x : Int16, y : Int16) : Int16
Returns the bitwise left shift of x
by y
, x << y
.
The right bits of the shift filled with zeros.
Left-overflowing bits, including the sign bit, are discarded.
For y >= 16
, the semantics is the same as for bitshiftLeft(x, y % 16)
.
For y < 0
, the semantics is the same as for bitshiftLeft(x, y + y % 16)
.
Example:
Int16.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
Note: The reason why this function is defined in this library (in addition
to the existing <<
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use <<
as a function value at the moment.
Function bitshiftRight
func bitshiftRight(x : Int16, y : Int16) : Int16
Returns the signed bitwise right shift of x
by y
, x >> y
.
The sign bit is retained and the left side is filled with the sign bit.
Right-underflowing bits are discarded, i.e. not rotated to the left side.
For y >= 16
, the semantics is the same as for bitshiftRight(x, y % 16)
.
For y < 0
, the semantics is the same as for bitshiftRight (x, y + y % 16)
.
Example:
Int16.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
Note: The reason why this function is defined in this library (in addition
to the existing >>
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use >>
as a function value at the moment.
Function bitrotLeft
func bitrotLeft(x : Int16, y : Int16) : Int16
Returns the bitwise left rotatation of x
by y
, x <<> y
.
Each left-overflowing bit is inserted again on the right side.
The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.
Changes the direction of rotation for negative y
.
For y >= 16
, the semantics is the same as for bitrotLeft(x, y % 16)
.
Example:
Int16.bitrotLeft(0x2001, 4) // => +18 // 0x12.
Note: The reason why this function is defined in this library (in addition
to the existing <<>
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use <<>
as a function value at the moment.
Function bitrotRight
func bitrotRight(x : Int16, y : Int16) : Int16
Returns the bitwise right rotation of x
by y
, x <>> y
.
Each right-underflowing bit is inserted again on the right side.
The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.
Changes the direction of rotation for negative y
.
For y >= 16
, the semantics is the same as for bitrotRight(x, y % 16)
.
Example:
Int16.bitrotRight(0x2010, 8) // => +4_128 // 0x01020.
Note: The reason why this function is defined in this library (in addition
to the existing <>>
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use <>>
as a function value at the moment.
Function bittest
func bittest(x : Int16, p : Nat) : Bool
Returns the value of bit p
in x
, x & 2**p == 2**p
.
If p >= 16
, the semantics is the same as for bittest(x, p % 16)
.
This is equivalent to checking if the p
-th bit is set in x
, using 0 indexing.
Example:
Int16.bittest(128, 7) // => true
Function bitset
func bitset(x : Int16, p : Nat) : Int16
Returns the value of setting bit p
in x
to 1
.
If p >= 16
, the semantics is the same as for bitset(x, p % 16)
.
Example:
Int16.bitset(0, 7) // => +128
Function bitclear
func bitclear(x : Int16, p : Nat) : Int16
Returns the value of clearing bit p
in x
to 0
.
If p >= 16
, the semantics is the same as for bitclear(x, p % 16)
.
Example:
Int16.bitclear(-1, 7) // => -129
Function bitflip
func bitflip(x : Int16, p : Nat) : Int16
Returns the value of flipping bit p
in x
.
If p >= 16
, the semantics is the same as for bitclear(x, p % 16)
.
Example:
Int16.bitflip(255, 7) // => +127
Value bitcountNonZero
let bitcountNonZero : (x : Int16) -> Int16
Returns the count of non-zero bits in x
.
Example:
Int16.bitcountNonZero(0xff) // => +8
Value bitcountLeadingZero
let bitcountLeadingZero : (x : Int16) -> Int16
Returns the count of leading zero bits in x
.
Example:
Int16.bitcountLeadingZero(0x80) // => +8
Value bitcountTrailingZero
let bitcountTrailingZero : (x : Int16) -> Int16
Returns the count of trailing zero bits in x
.
Example:
Int16.bitcountTrailingZero(0x0100) // => +8
Function addWrap
func addWrap(x : Int16, y : Int16) : Int16
Returns the sum of x
and y
, x +% y
.
Wraps on overflow/underflow.
Example:
Int16.addWrap(2 ** 14, 2 ** 14) // => -32_768 // overflow
Note: The reason why this function is defined in this library (in addition
to the existing +%
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use +%
as a function value at the moment.
Function subWrap
func subWrap(x : Int16, y : Int16) : Int16
Returns the difference of x
and y
, x -% y
.
Wraps on overflow/underflow.
Example:
Int16.subWrap(-2 ** 15, 1) // => +32_767 // underflow
Note: The reason why this function is defined in this library (in addition
to the existing -%
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use -%
as a function value at the moment.
Function mulWrap
func mulWrap(x : Int16, y : Int16) : Int16
Returns the product of x
and y
, x *% y
. Wraps on overflow.
Wraps on overflow/underflow.
Example:
Int16.mulWrap(2 ** 8, 2 ** 8) // => 0 // overflow
Note: The reason why this function is defined in this library (in addition
to the existing *%
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use *%
as a function value at the moment.
Function powWrap
func powWrap(x : Int16, y : Int16) : Int16
Returns x
to the power of y
, x **% y
.
Wraps on overflow/underflow.
Traps if y < 0 or y >= 16
.
Example:
Int16.powWrap(2, 15) // => -32_768 // overflow
Note: The reason why this function is defined in this library (in addition
to the existing **%
operator) is so that you can use it as a function
value to pass to a higher order function. It is not possible to use **%
as a function value at the moment.