本文介绍如何在 go 语言中实现字节数组(`[]byte`)整体左移 1 位的位运算逻辑,确保跨字节进位正确,适用于密码学、协议解析等底层数据处理场景。
在单个字节上执行左移(整体左移 1 位时,关键在于处理“进位传播”:前一个字节的最高位(bit 7)需作为下一个字节的最低位(bit 0)的输入。例如,数组 [0xD3, 0x4A](二进制 11010011 01001010)左移 1 位后应变为 10100110 10010100 —— 即首字节 0xD3 的最高位 1 “溢出”至次字节 0x4A 的最低位,原次字节左移后最低位被该进位覆盖。
以下是高效、无副作用的标准实现:
func shiftBytesLeft(a []byte) []byte {
if len(a) == 0 {
return a
}
dst := make([]byte, len(a))
n := len(a)
// 处理前 n-1 个字节:左移本字节,并从下一个字节借最高位(>>7)
for i := 0; i < n-1; i++ {
dst[i] = a[i]<> 7)
}
// 最后一个字节仅左移,无后续字节提供进位
dst[n-1] = a[n-1] << 1
return dst
}
✅ 工作原理说明:
- a[i]
- a[i+1] >> 7:提取下一个字节的最高位(即 0x80 >> 7 == 1),结果为 0 或 1;
- | 操作将其置入当前字节的最低位(LSB),完成进位合并;
- 边界安全:空切片直接返回;单字节数组仅执行
? 使用示例: