之前做游戏快照的时候。大量的游戏对象存在大量的bool值参数。序列化了之后也是一个不小的内存占用。顺便整理了一下做了基于位运算的bool值读写。
package funs
type BoolMask128 struct {
A BoolMask64
B BoolMask64
}
func (this *BoolMask128) Set(index int, judge bool) {
if index >= 64 {
this.B.Set(index-64, judge)
} else {
this.A.Set(index, judge)
}
}
func (this *BoolMask128) Get(index int) bool {
if index >= 64 {
return this.B.Get(index - 64)
} else {
return this.A.Get(index)
}
}
type BoolMask64 uint64
func (this *BoolMask64) Set(index int, judge bool) {
if judge {
*this = BoolMask64(uint64(*this) | uint64(1<<index))
} else {
*this = BoolMask64(uint64(*this) &^ uint64(1<<index))
}
}
func (this *BoolMask64) Get(index int) bool {
return uint64(*this)&uint64(1<<index) > 0
}
type BoolMask32 uint32
func (this *BoolMask32) Set(index int, judge bool) {
if judge {
*this = BoolMask32(uint32(*this) | uint32(1<<index))
} else {
*this = BoolMask32(uint32(*this) &^ uint32(1<<index))
}
}
func (this *BoolMask32) Get(index int) bool {
return uint32(*this)&uint32(1<<index) > 0
}
type BoolMask16 uint16
func (this *BoolMask16) Set(index int, judge bool) {
if judge {
*this = BoolMask16(uint16(*this) | uint16(1<<index))
} else {
*this = BoolMask16(uint16(*this) &^ uint16(1<<index))
}
}
func (this *BoolMask16) Get(index int) bool {
return uint16(*this)&uint16(1<<index) > 0
}
type BoolMask8 uint8
func (this *BoolMask8) Set(index int, judge bool) {
if judge {
*this = BoolMask8(uint8(*this) | uint8(1<<index))
} else {
*this = BoolMask8(uint8(*this) &^ uint8(1<<index))
}
}
func (this *BoolMask8) Get(index int) bool {
return uint8(*this)&uint8(1<<index) > 0
}