# Difference between revisions of "BitShift"

## BitShift(x, shift, left, I, rotate, bit )

Shifts the bits in an integer value «x» bit «shift» positions to the right, or by «shift» positions to the left when «left» is specified as true. Alternatively, «shift» can be negative to invert the shift direction.

When an array is provided and the index «I» is specified, the bits are shifted to the adjacent cell. Each integer in each cell is considered to have 64 bits.

When «rotate» is true, the bits are rotated, so that a bit that shifts off the right edge is used for the value of the bit shifted in on the left.

When «rotate» is not specified, you can specify the value for new bits in the «bit» parameter, which must be either 0 or 1.

When neither «rotate» nor «bit» are specified, then 0 bits are shifted into the result when shifting left, but when shifting right, the most significant bit (the 64th bit) is used, which has the effect of preserving the sign of the integer. This default is equivalent to integer division by powers of 2 when shifting right, and multiplication by powers of 2 when shifting left.

## Examples

To make the effect of the function obvious, integers are written here in binary notation.

`BitShift(0b110101011100, 5) →`
`0b1101010`
`BitShift(3420, 5) →`
`106`
`BitShift(0b110101011100, 5, left: true) →`
`0b110101011100000`
`BitShift(3420, 5, left: true) →`
`109440`

Negative numbers have leading 1 bits, and are 64 bits in length. Shifting right shifts 1s into the left side.

`BitShift(-170, 5) →`
`0b1111111111111111111111111111111111111111111111111111111111111010 = -6`

Or you can shift in zero bits:

`BitShift(-170, 5) →`
`0b0000011111111111111111111111111111111111111111111111111111111010 = 576460752303423482`
`BitShift(0b1101010111, 3, rotate: true) →`
`0b1110000000000000000000000000000000000000000000000000000001101010`

Next, shifting across cells of an array:

`x :=` `BitShift(x, 4, I: J) → ` `BitShift(x, 4, I: J, rotate: true) → ` ### Convert Hexadecimal to RGB numeric values

Colors are commonly defined with three channels for information: Red, Green, and Blue. The BitShift function offers a straightforward way to convert colors defined by a hexadecimal string to numerical RGB triplet.

`Local hex_val := 0x0079BF`
`Local R := BitShift( hex_val, 16 ) → 00`
`Local G := BitShift( hex_val, 8 ) - BitShift( R, 8, left: True ) → 79`
`Local B := hex_val - BitShift( R, 16, True ) - BitShift( G, 8, True ) → BF`

Displayed as integers, these values are `[R, G, B] = [0, 121, 191]`

## History

Introduced in Analytica 5.0.