The NOT
operator returns the 1's complement of its operand, after it has been rounded down if it is not an integer. The 1's complement of a value can be considered -1-value
. Some examples are:
NOT 0
is -1
NOT -1
is 0
NOT 5
is -6
NOT 5.7
is -6
NOT -6
is 5
NOT -6.2
is 6
Note that e.g. NOT5
is a variable name; to use the NOT
operator without it becoming a variable name, it must be followed by a space, one of the other unary operators, or parentheses.
It is important not to confuse this (integer-only) bitwise NOT with !
, the logical NOT operator. NOT FALSE
(NOT 0
) has the logical sense of TRUE (though it is not the same value as TRUE
, 1
), NOT TRUE
also has the logical sense of TRUE, because the bitwise NOT 1
is -2, and any nonzero numerical value interpreted as a logic value is considered to be TRUE. (Most programming languages, when they have to have a correspondence between numerical values and logical values, use 0 for FALSE and -1 for TRUE, precisely so that the bitwise NOT on the boolean values is the same as the logical NOT. SmileBoom decided to go a different way.)
This operator is in the unary precedence group, which is the highest. This means all unary operators are evaluated before any others, e.g. the bitwise operators, so NOT A AND B
is evaluated as (NOT A) AND B
. Since all unary operators are prefixes to their operands, they are right-associative, i.e. the rightmost ones are evaluated first.