Note: This module is only present on main
, and has not yet been stabilized and released in a tag.
The following API are defined for all integer types:
-
The
gcd(_:_:)
free function implements the Greatest Common Divisor operation. -
The
shifted(rightBy:rounding:)
method implements bitwise shift with rounding. -
The
divided(by:rounding:)
method implements division with specified rounding. (See alsoSignedInteger.divided(by:rounding:)
,remainder(dividingBy:rounding:)
, andeuclideanDivision(_:_:)
below).
The following API are defined for signed integer types:
-
The
divided(by:rounding:)
method implementing division with specified rounding, returning both quotient and remainder. This requires a signed type because the remainder is not generally representable for unsigned types. This is a disfavored overload; by default, you will get only the quotient as the result:let p = 5.divided(by: 3, rounding: .up) // p = 2 let (q, r) = 5.divided(by: 3, rounding: .up) // q = 2, r = -1
-
The
remainder(dividingBy:rounding:)
method implementing the remainder operation; therounding
argument describes how to round the quotient, which is not returned. (The remainder is always exact, and hence is not rounded). -
The
euclideanDivision(_:_:)
free function implements Euclidean division. In this operation, the remainder is chosen to always be non-negative. This does not correspond to any rounding rule on the quotient, which is why it uses a distinct API.
- The
rotated(right:)
androtated(left:)
methods implement bitwise rotation for signed and unsigned integer types. The count parameter may be anyBinaryInteger
type.
The following saturating operations are defined as methods on FixedWidthInteger
:
addingWithSaturation(_:)
subtractingWithSaturation(_:)
negatedWithSaturation(_:)
multipliedWithSaturation(by:)
shiftedWithSaturation(leftBy:rounding:)
These implement saturating arithmetic.
They are an alternative to the usual +
, -
, and *
operators, which trap if the result cannot be represented in the argument type, and &+
, &-
, &*
, and <<
, which wrap out-of-range results modulo 2ⁿ for some n.
Instead these methods clamp the result to the representable range of the type:
let x: Int8 = 84
let y: Int8 = 100
let a = x + y // traps due to overflow
let b = x &+ y // wraps to -72
let c = x.addingWithSaturation(y) // saturates to 127
If you are using saturating arithmetic, you may also want to perform saturating conversions between integer types; this functionality is provided by the standard library via the init(clamping:)
API.
The RoundingRule
enum is used with shift, division, and round operations to specify how to round their results to a representable value.