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
|
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