RorateBits 함수 추가

This commit is contained in:
2024-07-18 17:06:51 +09:00
parent 64d341e307
commit 17d31f35f3

72
misc.go
View File

@ -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) - 1
carry := data[0] & mask
for i := 1; i < inlen; i++ {
nextcarry := data[i] & mask
data[i] = (data[i] >> 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<<n) - 1) << (8 - n)
carry := data[0] & mask
for i := inlen - 1; i >= 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)
}
}