RorateBits 함수 추가
This commit is contained in:
72
misc.go
72
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) - 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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user