0

0

Go语言中无符号整数到二进制位切片的转换方法

心靈之曲

心靈之曲

发布时间:2025-11-05 14:32:11

|

805人浏览过

|

来源于php中文网

原创

Go语言中无符号整数到二进制位切片的转换方法

本文详细介绍了如何在go语言中将无符号整数(uint)转换为其二进制表示的字节切片([]byte),其中切片元素为0或1。核心方法是利用strconv.formatuint将整数转换为二进制字符串,然后遍历该字符串,通过字符的ascii值转换得到最终的数字字节切片,并提供了完整的示例代码及注意事项。

在Go语言开发中,我们有时需要将一个无符号整数(如uint、uint64等)转换为一个由其二进制位组成的切片,其中每个元素代表一个二进制数字(0或1)。虽然Go标准库没有直接提供一个函数能一步完成这种转换并返回[]byte{0, 1}的格式,但我们可以通过组合现有功能来实现这一目标。

核心方法:利用 strconv.FormatUint

实现此功能的主要工具是Go标准库中的 strconv.FormatUint 函数。这个函数可以将一个 uint64 类型的无符号整数转换为指定进制的字符串表示。

strconv.FormatUint 的函数签名如下:

func FormatUint(i uint64, base int) string
  • i: 待转换的无符号整数。
  • base: 目标进制(例如,2表示二进制,10表示十进制,16表示十六进制)。

当我们将 base 参数设置为 2 时,FormatUint 就会返回给定整数的二进制字符串表示。例如,对于整数 2,strconv.FormatUint(2, 2) 将返回字符串 "10"。对于整数 10,它将返回 "1010"。

立即学习go语言免费学习笔记(深入)”;

LogoMaker
LogoMaker

免费在线制作Logo,在几分钟内完成标志设计

下载

处理字符串表示以获取二进制位

strconv.FormatUint 返回的字符串(如 "10")实际上是由字符 '1' 和 '0' 组成的。在ASCII编码中,字符 '0' 的值为 48,字符 '1' 的值为 49。为了将这些字符转换为实际的数字 0 和 1 的 byte 值,我们需要进行一个简单的转换:

  1. 遍历 strconv.FormatUint 返回的二进制字符串。
  2. 对于字符串中的每一个字符(rune),将其转换为 byte 类型,然后减去字符 '0' 的ASCII值。
    • 如果字符是 '1',那么 byte('1' - '0') 结果为 byte(49 - 48),即 byte(1)。
    • 如果字符是 '0',那么 byte('0' - '0') 结果为 byte(48 - 48),即 byte(0)。
  3. 将这些转换后的 byte 值逐一追加到一个新的 []byte 切片中。

示例代码

下面是一个完整的Go语言函数,它实现了将 uint64 转换为其二进制位切片的功能:

package main

import (
    "fmt"
    "strconv"
)

// Bits 将一个 uint64 类型的无符号整数转换为其二进制表示的 []byte 切片。
// 切片中的每个元素都是 0 或 1,表示对应的二进制位。
// 返回的切片顺序为从最高有效位(MSB)到最低有效位(LSB)。
func Bits(i uint64) []byte {
    // 使用 strconv.FormatUint 将整数转换为其二进制字符串表示。
    // 例如,对于 i=2,结果是 "10"。
    binaryString := strconv.FormatUint(i, 2)

    // 初始化一个字节切片来存储二进制位。
    // 预分配容量可以提高性能。
    bits := make([]byte, 0, len(binaryString))

    // 遍历二进制字符串的每个字符(rune)。
    // 每个字符都是 '0' 或 '1'。
    for _, r := range binaryString {
        // 将字符 '0' 或 '1' 转换为对应的字节 0 或 1。
        // ASCII 值 '0' 是 48,'1' 是 49。
        // 减去 '0' 的 ASCII 值即可得到实际的数字。
        bits = append(bits, byte(r - '0'))
    }

    return bits
}

func main() {
    // 示例用法
    num1 := uint64(2)
    fmt.Printf("Number: %d, Binary Bits: %v\n", num1, Bits(num1)) // 输出: Number: 2, Binary Bits: [1 0]

    num2 := uint64(10)
    fmt.Printf("Number: %d, Binary Bits: %v\n", num2, Bits(num2)) // 输出: Number: 10, Binary Bits: [1 0 1 0]

    num3 := uint64(0)
    fmt.Printf("Number: %d, Binary Bits: %v\n", num3, Bits(num3)) // 输出: Number: 0, Binary Bits: [0]

    num4 := uint64(255)
    fmt.Printf("Number: %d, Binary Bits: %v\n", num4, Bits(num4)) // 输出: Number: 255, Binary Bits: [1 1 1 1 1 1 1 1]

    num5 := uint64(12345)
    fmt.Printf("Number: %d, Binary Bits: %v\n", num5, Bits(num5)) // 输出: Number: 12345, Binary Bits: [1 1 0 0 0 0 0 0 1 1 1 0 0 1]
}

注意事项

  1. 返回顺序: strconv.FormatUint 生成的二进制字符串是从最高有效位(MSB)到最低有效位(LSB)的顺序。因此,上述 Bits 函数返回的 []byte 切片也遵循这个顺序。如果需要最低有效位在前(LSB-first)的顺序,则需要在函数返回前对切片进行反转操作。
  2. 输入类型: Bits 函数接受 uint64 类型的参数。这意味着它可以处理所有 Go 语言的无符号整数类型(uint、uint8、uint16、uint32、uint64),因为它们都可以安全地转换为 uint64。
  3. 性能考量: 对于大多数应用场景,这种基于字符串转换的方法足够高效且代码可读性好。如果对性能有极致要求,例如处理海量数据或在性能关键型循环中,可以考虑使用位操作(如循环右移 >> 和位与 & 1)来逐位提取二进制数字,但这会使代码稍微复杂。
  4. byte 与 int: 返回 []byte 切片,其中每个元素是 0 或 1 的 byte 值,而不是 int 值。这通常是足够的,因为 byte 类型本质上是 uint8,可以很好地表示 0 和 1。

总结

通过结合 strconv.FormatUint 和简单的字符到数字转换逻辑,我们可以轻松地在Go语言中实现将无符号整数转换为其二进制位切片的功能。这种方法简洁、易懂,并且在大多数情况下都能满足需求。理解其工作原理有助于更好地处理Go语言中的位操作和数据表示。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

546

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

156

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

76

2025.08.07

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

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

精品课程

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

共32课时 | 2.9万人学习

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

共10课时 | 0.8万人学习

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

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