为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Golang 移动字节数组?

如何使用 Golang 移动字节数组?

Go
子衿沉夜 2021-09-27 17:20:37
这里简单的工作代码左移一个字节的第一位package mainimport (    "fmt")type Byte bytefunc SL(b Byte) Byte {    if b&0x80 == 0x80 {        b <<= 1        b ^= 0x01    } else {        b <<= 1    }    return b}func main() {    var b Byte    b = 0xD3    fmt.Printf("old byte %#08b\n", b) // 11010011    c := SL(b)    fmt.Printf("new byte %#08b", c)   // 10100111}我应该怎么做才能移动字节数组,例如 type Byte [2]byte?
查看完整描述

3 回答

?
慕桂英546537

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.


查看完整回答
反对 回复 2021-09-27
?
holdtom

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

}


查看完整回答
反对 回复 2021-09-27
?
达令说

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

    }

}


查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 286 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信