Bitwise Operators
Bitwise operators are used for applying boolean operations at the individual bit level of
a value. They are commonly used to set and test flag values where a single 32-bit integer
may carry 32 different values in one integer. This is a very efficient way to pass a number
of options in a single value. Bitwise operators are also commonly used in hashing, compression,
and encryption algorithms, among others. Use of these operators is generally the province
of advanced programmers and they should not be used in place of the Boolean equivalents,
since although they may sometimes work, they could produce unexpected results. The bitwise
operators are AND
, OR
, and XOR
. These
should not be confused with the lowercase operators of the same name in
the case of AND
and OR
, which are the Boolean operators.
For those unfamiliar with bitwise operators, they operate on the individual bits where each
bit contains only 0 or 1. The AND
operator compares two values and only
returns the value 1 if both bits contain a 1, otherwise it returns 0. The OR
operator compares two values and returns 1 if either of the bits
contain 1, otherwise it returns 0. The XOR
operator compares two values
and returns 1 if one of the two values has a bit set and the other does not. If both values
are the same (both 1's or both 0's), then it returns 0. The following tables may help clarify things:
Op1 | Op2 | Result |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
A common use for the AND
operator is as a test to see if a bit is set in a value.
Op1 | Op2 | Result |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
A common use for the OR
operator is to set a bit in a value independent of its
current state.
Op1 | Op2 | Result |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
A common use for the XOR
operator is to toggle a bit in a value. Using
XOR
twice with the same operands will return the value back to its starting
point.
AND
Operand count
2 or more
Types
.nul
, .inf
, blob
, boolean
,
integer
, number
, string
Description
All operands other than .nul
and .inf
must be of the same type. If any operand is equal to .nul
then the result is .nul
. Otherwise if any operand is equal
to .inf
then the result is .inf
. Otherwise
the result is calculated according to the type of the operands.
Type name | Result for AND when applied to this type |
---|---|
.nul |
If any operand is .nul then the result is
.nul
|
.inf |
If any operand is .inf and no operand is
.nul then the result is .inf .
|
blob | The result is as long as the longest operand where operands that are not that long behave as if they have been extended with zero bytes. Each byte in the result is the bitwise combination of the corresponding bytes in the operands, where bytes are treated as unsigned values. |
boolean |
The result is calculated using the obvious meanings of AND ,
OR , and XOR .
|
integer | number | Operands that are of type number are converted to an integer by taking the integer part. The result is the bitwise combination of the integer operand values, where negative values are treated as if they represented the two's complement of their absolute value. |
string |
The result is as long as the longest operand and each character is the bitwise
combination of the corresponding characters in each operand string, where characters
are considered to be unsigned values. Where operands are not as long as the result
the operands behave as if they are extended with characters of Unicode code point
zero (.char(0) ).
|
OR
Operand count
2 or more
Types
.nul
, .inf
, blob
, boolean
,
integer
, number
, string
Description
All operands other than .nul
and .inf
must be of the same type. If any operand is equal to .nul
then the result is .nul
. Otherwise if any operand is equal
to .inf
then the result is .inf
. Otherwise
the result is calculated according to the type of the operands.
Type name | Result for OR when applied to this type |
---|---|
.nul |
If any operand is .nul then the result is
.nul
|
.inf |
If any operand is .inf and no operand is
.nul then the result is .inf .
|
blob | The result is as long as the longest operand where operands that are not that long behave as if they have been extended with zero bytes. Each byte in the result is the bitwise combination of the corresponding bytes in the operands, where bytes are treated as unsigned values. |
boolean |
The result is calculated using the obvious meanings of AND ,
OR , and XOR .
|
integer | number | Operands that are of type number are converted to an integer by taking the integer part. The result is the bitwise combination of the integer operand values, where negative values are treated as if they represented the two's complement of their absolute value. |
string |
The result is as long as the longest operand and each character is the bitwise
combination of the corresponding characters in each operand string, where characters
are considered to be unsigned values. Where operands are not as long as the result
the operands behave as if they are extended with characters of Unicode code point
zero (.char(0) ).
|
XOR
Operand count
2 or more
Types
.nul
, .inf
, blob
, boolean
,
integer
, number
, string
Description
All operands other than .nul
and .inf
must be of the same type. If any operand is equal to .nul
then the result is .nul
. Otherwise if any operand is equal
to .inf
then the result is .inf
. Otherwise
the result is calculated according to the type of the operands.
Type name | Result for XOR when applied to this type |
---|---|
.nul |
If any operand is .nul then the result is
.nul
|
.inf |
If any operand is .inf and no operand is
.nul then the result is .inf .
|
blob | The result is as long as the longest operand where operands that are not that long behave as if they have been extended with zero bytes. Each byte in the result is the bitwise combination of the corresponding bytes in the operands, where bytes are treated as unsigned values. |
boolean |
The result is calculated using the obvious meanings of AND ,
OR , and XOR .
|
integer | number | Operands that are of type number are converted to an integer by taking the integer part. The result is the bitwise combination of the integer operand values, where negative values are treated as if they represented the two's complement of their absolute value. |
string |
The result is as long as the longest operand and each character is the bitwise
combination of the corresponding characters in each operand string, where characters
are considered to be unsigned values. Where operands are not as long as the result
the operands behave as if they are extended with characters of Unicode code point
zero (.char(0) ).
|