3 回答
TA贡献1848条经验 获得超10个赞
您似乎想要旋转,而不是移动。您不使用uint16类型而不是 的任何特殊原因[2]byte?
无论如何,如果你真的想要[2]byte,这更简单并且不会分支:
func rol(v [2]byte) [2]byte {
x := int(v[0])<<8 | int(v[1])
x <<= 1
v[0] = byte(x >> 8)
v[1] = byte((x & 0xff) | x>>16)
return v
}
如果你想对任意大量的位进行这样的操作,你可以使用math/big.
TA贡献1805条经验 获得超10个赞
左移 1 位的解决方案。
func shiftBytesLeft(a []byte) (dst []byte) {
n := len(a)
dst = make([]byte, n)
for i := 0; i < n-1; i++ {
dst[i] = a[i] << 1
dst[i] = (dst[i] & 0xfe) | (a[i+1] >> 7)
}
dst[n-1] = a[n-1] << 1
return dst
}
TA贡献1821条经验 获得超6个赞
这是一个可以同时进行左移和右移的实现:
// ShiftLeft performs a left bit shift operation on the provided bytes.
// If the bits count is negative, a right bit shift is performed.
func ShiftLeft(data []byte, bits int) {
n := len(data)
if bits < 0 {
bits = -bits
for i := n - 1; i > 0; i-- {
data[i] = data[i]>>bits | data[i-1]<<(8-bits)
}
data[0] >>= bits
} else {
for i := 0; i < n-1; i++ {
data[i] = data[i]<<bits | data[i+1]>>(8-bits)
}
data[n-1] <<= bits
}
}
- 3 回答
- 0 关注
- 286 浏览
添加回答
举报