# Bit Functions¶

The following bit related functions are available in Okera.

Function Description
`bitand()` Performs a bitwise `AND` operation on the two given integer values
`bitnot()` Performs a bitwise `NOT` operation on the given integer value
`bitor()` Performs a bitwise `OR` operation on the two given integer values
`bitxor()` Performs a bitwise `XOR` operation on the two given integer values
`countset()` Counts the set (or unset) number of bits in a given integer number
`getbit()` Returns the bit at a specific position in a given integer number
`rotateleft()` Rotates the bits in a number to the left
`rotateright()` Rotates the bits in a number to the right
`setbit()` Sets a specific bit in a given number
`shiftleft()` Shifts the bits in a number to the left
`shiftright()` Shifts the bits in a number to the right

The parameters (one or two, based on the arity of the function) can be actual field names of relations, or may be specified as an `<expressions>`.

Example: Using an expression as a parameter

``````> SELECT bitand(3+4, 3)
3
``````

In the example, adding `3` plus `4` is `7`, or `0111` in binary format. Performing an `AND` bitwise operation with `3`, that is `0011` in binary format, will return only the bits set in both, resulting in `0011`, or `3` in decimal format.

Note that the outcome of invoking these functions may depend on the parameter data types used when invoking them. In the example, the expression value of `7` is implicitly treated as a `SMALLINT`. When using the `rotate` and `shift` functions, the size of the data type (explicit stated or implicitly derived) is important as bits are moved within the given number of bits. The examples below demonstrate how in an 16-bit `SMALLINT` the shift and move results produce numbers that fit into the same data type.

The following explains the functions and statements in more detail.

• `bitand(<numeric_type>, <numeric_type>)`, `bitnot(<numeric_type>)`, `bitor(<numeric_type>, <numeric_type>)`, and `bitxor(<numeric_type>, <numeric_type>)`

Allows to perform bitwise operations on the given values.

Example: Using bitwise operations to compute results

``````> -- 121 = 0111 1001 and 52 = 0011 0100
> SELECT bitand(121, 52);
48 -- 0011 0000

> SELECT bitor(121, 52);
125 -- 0011 1101

> SELECT bitxor(121, 52);
77 -- 0100 1101

> SELECT bitnot(121);
-122 -- 1000 0110
``````
• `countset(<numeric_type>)`, `getbit(<numeric_type>, INT)`, and `setbit(<numeric_type>, INT)`

These bit related utility functions allow to count and operate on bits in numbers.

Example: Using bit related utility functions

``````> -- 121 = 0111 1001
> SELECT countset(121);
5

> SELECT getbit(121, 1), getbit(121, 3);
0      1

> SELECT setbit(121, 1);
123 -- 0111 1011
``````
• `rotateleft(<numeric_type>, INT)`, `rotateright(<numeric_type>, INT)`, `shiftleft(<numeric_type>, INT)`, and `shiftright(<numeric_type>, INT)`

This group of functions allow to move the bits of a number left or right.

The `rotate` functions perform a circular shift (also called rotate no carry), that is, they fill the empty bit at the left- or the rightmost position with the bit that dropped off at the other end.

Conversely, the `shift` functions perform a logical shift. that is, they fill the empty bit at the left- or the rightmost position always with a `0` bit, while ignoring the bit that dropped off at the other end.

Example: Using bit movements to modify numbers

``````> -- 121 = 0111 1001
> SELECT rotateleft(121, 3);
-53 -- 1100 1011

> SELECT rotateright(121, 2);
94  -- 0101 1110

> SELECT shiftleft(121, 3);
-56 -- 1100 1000

> SELECT shiftright(121, 2);
30  -- 0001 1110
``````