# Bitwise Operations¶

## bitand¶

Syntax

```bitand(x,y)
bitand(x,y,assumedType)
```

Description

Performs the logical AND operation on each pair of corresponding bits of `x` and `y.` If `x` or `y` is an array, then it will perform the logical AND operation of each pair of elements.

• The function expects that the length of all input arrays to be equal. It will expand any scalar inputs to the appropriately sized array before performing `bitand` of each element.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before computing the logical AND operation.
• If `assumedType` is provided, it identifies the type for the inputs `x` and `y` as either fixed width signed or fixed width unsigned integers. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitcmp¶

Syntax

```bitcmp(x)
bitcmp(x,assumedType)
```

Description

Performs the bitwise complement of the operand. The input may be singular or an array of numerical or logical values. If `x` is an array, it computes `bitcmp` for each element in `x`.

• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before computing the complement.
• If `assumedType` is provided, it identifies the type for the input `x` as either a fixed width signed or fixed width unsigned integer. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitor¶

Syntax

```bitor(x,y)
bitor(x,y,assumedType)
```

Description

Performs the logical OR operation on each pair of corresponding bits of `x` and `y.` If `x` or `y` is an array, then it will perform the logical OR operation of each pair of elements.

• The function expects that the length of all input arrays to be equal. It will expand any scalar inputs to the appropriately sized array before performing `bitor` of each element.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before computing the logical OR operation.
• If `assumedType` is provided, it identifies the type for the inputs `x` and `y` as either fixed width signed or fixed width unsigned integers. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitget¶

Syntax

```bitget(x,bitPosition)
bitget(x,bitPosition,assumedType)
```

Description

Returns the bit value of `x` at location `bitPosition.` The `bitPosition` must be a positive integer between 1 and the number of bits in the integer class of `x`. The `bitPosition` may be an integer array, in which case, this function returns the bit values of `x` and each location identified in the array `bitPosition.`

• If `x` is an array, it returns the bit value at position `bitPosition` for each element in `x`. If `bitPosition` is an array, its length must agree with the length of `x`.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before retrieving any bit values.
• If `assumedType` is provided, it identifies the type for the input `x` as either a fixed width signed or fixed width unsigned integer. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitset¶

Syntax

```bitset(x,bitPosition,val)
bitset(x,bitPosition,val,assumedType)
```

Description

Returns `x` with the bit at location `bitPosition` set to `val.` If `x` is an array, it returns an array where each element of `x` has the `bitPosition` set to `val.` The `bitPosition` must be a positive integer between 1 and the number of bits in the integer class of `x.`

• The operand `bitPosition` may also be an integer array. Note that `val` may be a scalar or numeric array, however, `val` will be converted to logical array before it is used to set bits in `x.`
• The function expects that the length of all input arrays to be equal. It will expand any scalar inputs to the appropriately sized array before performing `bitset` of each element.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before setting any bits.
• If `assumedType` is provided, it identifies the type for the input `x` as either a fixed width signed or fixed width unsigned integer. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitshift¶

Syntax

```bitshift(x,n)
bitshift(x,n,assumedType)
```

Description

When `n` is positive integer, return `x` shifted to the left by `n` bits. This is equivalent to multiplying `x` by `2^n`. When `n` is negative, return `x` shifted to the right by `n` bits. This is equivalent to dividing by `2^n` and rounding to the nearest integer less than or equal to the result. Any overflow bits are truncated.

• When `x` is real, Grackle will convert the operand to an unsigned 64bit integer before performing the shift operation. Negative real values for `x` are not permitted.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before shifting any bits.
• If `assumedType` is provided, it identifies the type for the input `x` as either a fixed width signed or fixed width unsigned integer. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.

## bitxor¶

Syntax

```bitxor(x,y)
bitxor(x,y,assumedType)
```

Description

Performs the logical exclusive OR operation on each pair of corresponding bits of the operands. If `x` or `y` is an array, then it will perform the logical XOR operation of each pair of elements.

• The function expects that the length of all input arrays to be equal. It will expand any scalar inputs to the appropriately sized array before performing `bitxor` of each element.
• If `assumedType` is not provided, Grackle will implicitly convert real inputs to 64bit unsigned integers before computing the logical XOR operation.
• If `assumedType` is provided, it identifies the type for the inputs `x` and `y` as either fixed width signed or fixed width unsigned integers. It must have the form `'intN'` or `'uintN'` where `N` is a positive integer.