gpt4 book ai didi

go - 如何在golang结构中使用bit而不是bool?

转载 作者:行者123 更新时间:2023-12-04 14:36:54 25 4
gpt4 key购买 nike

type EventPrefs struct {
Call bool
Presence bool
Endpoint bool
VoiceMail bool
CallRecording bool
}
目前,该结构类型的大小为 5 个字节,但我想使用位。有没有办法做到这一点?

最佳答案

Go中没有“位”类型,所以如果你想打包多个bool信息成比特,你必须自己实现。声明类型为 uint8 的字段(或 uint16 或任何其他整数类型),并提供获取/设置字段特定位的方法。
一般位设置/清除就像这样简单:

var masks = []uint8{0x01, 0x02, 0x04, 0x08, 0x10}

func set(field, data uint8, b bool) uint8 {
if b {
return data | masks[field] // Set bit
}
return data ^ masks[field] // Clear bit
}

func get(field, data uint8) bool {
return data&masks[field] != 0
}
将您的 5 个 bool 字段打包成一个 uint8值(value):
type EventPrefs struct {
data uint8
}

func (e *EventPrefs) SetCall(b bool) { e.data = set(0, e.data, b) }
func (e *EventPrefs) Call() bool { return get(0, e.data) }

func (e *EventPrefs) SetPresence(b bool) { e.data = set(1, e.data, b) }
func (e *EventPrefs) Presence() bool { return get(1, e.data) }

func (e *EventPrefs) SetEndpoint(b bool) { e.data = set(2, e.data, b) }
func (e *EventPrefs) Endpoint() bool { return get(2, e.data) }

func (e *EventPrefs) SetVoiceMail(b bool) { e.data = set(3, e.data, b) }
func (e *EventPrefs) VoiceMail() bool { return get(3, e.data) }

func (e *EventPrefs) SetCallRecording(b bool) { e.data = set(4, e.data, b) }
func (e *EventPrefs) CallRecording() bool { return get(4, e.data) }
测试它:
ep := &EventPrefs{}

fmt.Println("Calls:", ep.Call(), ep.data)
ep.SetCall(true)
fmt.Println("Calls:", ep.Call(), ep.data)

fmt.Println("Presence:", ep.Presence(), ep.data)
ep.SetPresence(true)
fmt.Println("Presence:", ep.Presence(), ep.data)
ep.SetPresence(false)
fmt.Println("Presence:", ep.Presence(), ep.data)
哪些输出(在 Go Playground 上试试):
Calls: false 0
Calls: true 1
Presence: false 1
Presence: true 3
Presence: false 1
节省 4 个字节值得吗?很少。
注:上述解决方案可以有很多变化。例如,可以使用位移来“计算”掩码, set()get()函数可以是 EventPrefs 的方法所以 data不需要参数(并且 set() 可以直接设置 EventPrefs.data 字段,因此也不需要返回值)。如 set()仍然是一个函数, data param 可以是一个指针,所以 set()可以改变指向的值而不返回新的 datadata字段可能有自己的声明类型,例如 bitpackget()set()附在其上的方法。
见相关: Difference between some operators "|", "^", "&", "&^". Golang

关于go - 如何在golang结构中使用bit而不是bool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68082290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com