0

0

如何在 Go 中对字节数组进行左移一位(跨字节进位)

碧海醫心

碧海醫心

发布时间:2026-02-05 14:37:07

|

857人浏览过

|

来源于php中文网

原创

如何在 Go 中对字节数组进行左移一位(跨字节进位)

本文详解如何在 go 中实现字节数组的逻辑左移一位操作,确保高位进位正确传递到下一个字节,适用于位运算、密码学或协议解析等场景。

在单个字节上执行左移(整体左移一位时,关键在于处理跨字节进位:前一个字节的最高位(bit 7)应作为后一个字节的最低位(bit 0)的输入。这本质上是将整个字节数组视为一个大端排列的二进制大整数,并对其执行一次逻辑左移。

以下是一个健壮、通用的 shiftBytesLeft 函数实现:

func shiftBytesLeft(a []byte) []byte {
    if len(a) == 0 {
        return a
    }
    dst := make([]byte, len(a))
    // 处理除最后一个字节外的所有字节:左移本字节,并从下一个字节借入最高位(作为本字节的 LSB)
    for i := 0; i < len(a)-1; i++ {
        dst[i] = a[i]<<1 | (a[i+1] >> 7)
    }
    // 最后一个字节仅左移,低位补 0(无后续字节提供进位)
    dst[len(a)-1] = a[len(a)-1] << 1
    return dst
}

工作原理说明

  • a[i]
  • a[i+1] >> 7:取下一个字节的最高位(bit7),右移到最低位位置(即 0x01 或 0x00);
  • | 操作将该进位“填入”当前字节左移后空出的最低位(LSB);
  • 最后一个字节无后续字节可借位,因此只左移,LSB 补 0。

? 使用示例

func main() {
    // 示例:2 字节数组 0xD3 0x4A → 二进制:11010011 01001010
    src := []byte{0xD3, 0x4A}
    fmt.Printf("原始: %08b %08b\n", src[0], src[1]) // 11010011 01001010

    shifted := shiftBytesLeft(src)
    fmt.Printf("左移1位: %08b %08b\n", shifted[0], shifted[1]) // 10100110 10010100
}

输出验证:

  • 0xD3(11010011)左移 → 1010011?,其 bit7(1)进位至下一字节 LSB;
  • 0x4A(01001010)左移 → 10010100,再与进位 1 组合 → 10010100(注意:此处进位实际加在 前一字节 的 LSB,即 0xD3>7 = 0?等等——需重新校验逻辑)

⚠️ 重要澄清与修正
上述函数中 dst[i] = a[i]>7) 的设计意图是——将 a[i+1] 的最高位“补到 a[i] 左移后的最低位”,这对应的是整个数组向左平移,高位溢出由右侧字节“供给”,即:

移动后,原 a[0] 的 bit7 成为 dst[0] 的 bit6,而 dst[0] 的 bit0 来自 a[1] 的 bit7 —— 这实际是循环左移风格?不,不是循环。

实际上,标准逻辑左移(非循环) 对多字节数组的定义是:

塔猫ChatPPT
塔猫ChatPPT

塔猫官网提供AI一键生成 PPT的智能工具,帮助您快速制作出专业的PPT。塔猫ChatPPT让您的PPT制作更加简单高效。

下载
  • 整体视为一个大整数(大端),左移 1 位 ⇒ 所有比特向更高位移动,最低位补 0,最高位(即 a[0] 的 bit7)被丢弃。
    但用户原始单字节函数 SL 的行为是:若原字节最高位为 1,则左移后 XOR 0x01 —— 这并非标准移位,而是某种自定义混淆操作(如 LFSR 抽头反馈)。

然而,根据问题中明确诉求 “shift array of bytes, like type Byte [2]byte”,并结合答案提供的函数,其目标是实现标准跨字节左移(带进位链),即:

Input:  [A7 A6 A5 A4 A3 A2 A1 A0] [B7 B6 B5 B4 B3 B2 B1 B0]
Output: [A6 A5 A4 A3 A2 A1 A0 B7] [B6 B5 B4 B3 B2 B1 B0 0]

✅ 这正是 shiftBytesLeft 函数所实现的:

  • dst[0] = (A>7) → A6..A0 + B7
  • dst[1] = B

因此该函数正确且高效。

? 注意事项

  • 输入切片为空时需提前返回,避免 panic;
  • 该函数不修改原切片,返回全新分配的 []byte;
  • 若需原地操作,可传入 dst []byte 作为参数并复用底层数组;
  • 右移或循环移位需另行实现,逻辑不同;
  • 在密码学等敏感场景中,注意常数时间要求(当前实现非恒定时间,因分支隐含数据依赖)。

总结:使用 shiftBytesLeft 即可安全、清晰地完成字节数组的逻辑左移一位操作,它准确建模了多字节二进制数的位级平移行为,是处理网络协议、硬件寄存器或加密算法中常见需求的可靠基础工具

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

231

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

344

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

196

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

601

2025.06.17

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号