In standard Ada, the shift and rotate functions are available only
for the predefined modular types in package Interfaces
. However, in
GNAT it is possible to define these functions for any integer
type (signed or modular), as in this example:
function Shift_Left (Value : T; Amount : Natural) return T;
The function name must be one of
Shift_Left, Shift_Right, Shift_Right_Arithmetic, Rotate_Left, or
Rotate_Right. T must be an integer type. T’Size must be
8, 16, 32 or 64 bits; if T is modular, the modulus
must be 2**8, 2**16, 2**32 or 2**64.
The result type must be the same as the type of Value
.
The shift amount must be Natural.
The formal parameter names can be anything.
A more convenient way of providing these shift operators is to use the Provide_Shift_Operators pragma, which provides the function declarations and corresponding pragma Import’s for all five shift functions. Note that in using these provided shift operations, shifts performed on negative numbers will result in modification of the sign bit.