diff --git a/misc.go b/misc.go index c9f8377..d13a2ac 100644 --- a/misc.go +++ b/misc.go @@ -147,3 +147,75 @@ func FindOneInSlice[T any](in []T, compare func(elem *T) bool) (int, bool) { } return -1, false } + +// RotateRight rotates the bits in the byte array to the right by n positions +func rotateBitsRight(data []byte, n int) { + // Normalize n to avoid unnecessary rotations + n = n % (len(data) * 8) + if n == 0 { + return + } + + // To hold the final rotated result + inlen := len(data) + for k := 0; k < n/8; k++ { + last := data[inlen-1] + for i := 0; i < inlen-1; i++ { + data[inlen-1-i] = data[inlen-2-i] + } + data[0] = last + } + + n = n % 8 + if n == 0 { + return + } + + mask := byte(1<> n) | (carry << (8 - n)) + carry = nextcarry + } + data[0] = (data[0] >> n) | (carry << (8 - n)) +} + +func rotateBitsLeft(data []byte, n int) { + // Normalize n to avoid unnecessary rotations + n = n % (len(data) * 8) + if n == 0 { + return + } + + // To hold the final rotated result + inlen := len(data) + for k := 0; k < n/8; k++ { + last := data[0] + for i := 0; i < inlen-1; i++ { + data[i] = data[i+1] + } + data[inlen-1] = last + } + + n = n % 8 + if n == 0 { + return + } + + mask := (byte(1<= 0; i-- { + nextcarry := data[i] & mask + data[i] = (data[i] << n) | (carry >> (8 - n)) + carry = nextcarry + } +} + +func RotateBits(data []byte, n int) { + if n > 0 { + rotateBitsRight(data, n) + } else { + rotateBitsLeft(data, -n) + } +}