blob: 329ab72b5547266d8d401439ad0afdfe0f8d94f1 [file] [log] [blame]
-------------------------------------------------------------------------------
-- Bitwise Operations.
-- This library provides bitwise operations. It provides all its functions inside the table `bit32`.
-- Unless otherwise stated, all functions accept numeric arguments in the range `(-2^51,+2^51);`
-- each argument is normalized to the remainder of its division by `2^32` and truncated to an integer
-- (in some unspecified way), so that its final value falls in the range `[0,2^32 - 1]`.
-- Similarly, all results are in the range `[0,2^32 - 1]`. Note that `bit32.bnot(0)` is `0xFFFFFFFF`,
-- which is different from `-1`.
-- @module bit32
-------------------------------------------------------------------------------
-- Returns the number `x` shifted `disp` bits to the right. The number `disp` may be any
-- representable integer. Negative displacements shift to the left.
--
-- This shift operation is what is called arithmetic shift.
-- Vacant bits on the left are filled with copies of the higher bit of `x`;
-- vacant bits on the right are filled with zeros. In particular, displacements with
-- absolute values higher than 31 result in zero or `0xFFFFFFFF`
-- (all original bits are shifted out).
--
-- @function [parent=#bit32] arshift
-- @param #number x value to shift
-- @param #number disp the number of shift, may an positive or negative integer
-- @return #number shifted number
-------------------------------------------------------------------------------
-- Returns the bitwise `and` of its operands.
-- @function [parent=#bit32] band
-- @param #number ... operands
-- @return #number bitwise `and` of operands
-------------------------------------------------------------------------------
-- Returns the bitwise negation of `x`. For any integer `x`, the following identity holds:
--
-- assert(bit32.bnot(x) == (-1 - x) % 2^32)
--
-- @function [parent=#bit32] bnot
-- @param #number x Number to proceed
-- @return #number bitwise negation
-------------------------------------------------------------------------------
-- Returns the bitwise `or` of its operands.
-- @function [parent=#bit32] bor
-- @param #number ... operands
-- @return #number bitwise `or` of operands
-------------------------------------------------------------------------------
-- Returns a boolean signaling whether the bitwise `and` of its operands is different from zero.
-- @function [parent=#bit32] btest
-- @return #boolean true if the bitwise `and` of its operands is different from zero
-------------------------------------------------------------------------------
-- Returns the bitwise exclusive `or` of its operands.
-- @function [parent=#bit32] bxor
-- @param #number ... operands
-- @return #number bitwise exclusive `or` of its operands.
-------------------------------------------------------------------------------
-- Returns the unsigned number formed by the bits `field` to `field + width - 1` from `n`.
-- Bits are numbered from `0` (least significant) to `31` (most significant).
-- All accessed bits must be in the range `[0, 31]`.
--
-- The default for `width` is `1`.
--
-- @function [parent=#bit32] extract
-- @param #number n input number
-- @param #number field bit field to apply
-- @param #number width the number of bit to take in account (optional, 1 by default)
-- @return #number extracted number
-------------------------------------------------------------------------------
-- Returns a copy of `n` with the bits `field` to `field + width - 1` replaced by the value `v`.
-- See `bit32.extract` for details about field and width.
-- @function [parent=#bit32] replace
-- @param #number n the number to copy
-- @param #number v the value v
-- @param #number field bits field to apply
-- @param #number width the number of bit to take in account (optional, 1 by default)
-- @return #number replaced number
-------------------------------------------------------------------------------
-- Returns the number `x` rotated `disp` bits to the left. The number `disp` may be
-- any representable integer.
-- For any valid displacement, the following identity holds:
--
-- assert(bit32.lrotate(x, disp) == bit32.lrotate(x, disp % 32))
--
-- In particular, negative displacements rotate to the right.
-- @function [parent=#bit32] lrotate
-- @param #number x original number
-- @param #number disp number of rotate
-- @return #number rotated number
-------------------------------------------------------------------------------
-- Returns the number `x` shifted `disp` bits to the left. The number `disp` may be any representable integer.
-- Negative displacements shift to the right. In any direction, vacant bits are filled with zeros.
-- In particular, displacements with absolute values higher than `31` result in zero (all bits are shifted out).
-- For positive displacements, the following equality holds:
--
-- assert(bit32.lshift(b, disp) == (b * 2^disp) % 2^32)
--
-- @function [parent=#bit32] lshift
-- @param #number x original number
-- @param #number disp the number of shift
-- @return #number shifted number
-------------------------------------------------------------------------------
-- Returns the number `x` rotated `disp` bits to the right. The number `disp` may be any representable integer.
-- For any valid displacement, the following identity holds:
--
-- assert(bit32.rrotate(x, disp) == bit32.rrotate(x, disp % 32))
--
-- In particular, negative displacements rotate to the left.
-- @function [parent=#bit32] rrotate
-- @param #number x original number
-- @param #number disp number of bits to rotate
-- @return #number rotated number
-------------------------------------------------------------------------------
-- Returns the number `x` shifted `disp` bits to the right. The number `disp` may be any
-- representable integer. Negative displacements shift to the left. In any direction,
-- vacant bits are filled with zeros. In particular, displacements with absolute
-- values higher than `31` result in zero (all bits are shifted out).
--
-- For positive displacements, the following equality holds:
--
-- assert(bit32.rshift(b, disp) == math.floor(b % 2^32 / 2^disp))
--
-- This shift operation is what is called logical shift.
-- @function [parent=#bit32] rshift
-- @param #number x original number
-- @param #number disp the number of shift
-- @return #number shifted number
return nil