代码拉取完成,页面将自动刷新
package datastructure
import (
"database/sql/driver"
"strconv"
)
func NewBitMap(size int) *BitMap {
if size < 0 {
panic("bitmap size < 0")
}
bm := &BitMap{
bits: nil,
size: size,
}
ci, _ := bm.getByteIndex(size - 1)
bm.bits = make([]byte, ci+1)
return bm
}
type BitMap struct {
bits []byte
size int
}
func (b *BitMap) GetBit(bitIndex int) bool {
if bitIndex < 0 || bitIndex >= b.size {
return false
}
ci, bi := b.getByteIndex(bitIndex)
return b.bits[ci]&1<<bi != 0
}
func (b *BitMap) getByteIndex(bitIndex int) (int, int) {
return bitIndex / 8, bitIndex % 8
}
func (b *BitMap) SetBit(bitIndex int, on bool) {
ci, bi := b.getByteIndex(bitIndex)
if on {
b.bits[ci] = b.bits[ci] | (1 << bi)
} else {
b.bits[ci] = b.bits[ci] & ^(1 << bi)
}
}
// Scan implements the Scanner interface.
func (b *BitMap) Scan(value any) error {
if value == nil {
b.bits, b.size = make([]byte, 0), 0
return nil
}
switch s := value.(type) {
case string:
str := s
length := len(str)
b.size = length * 4
b.bits = make([]byte, (b.size/8)+1)
for i := 0; i < length; i += 2 {
bi := (length - i) / 2
by := str[i : i+2]
in, err := strconv.ParseUint(by, 16, 0)
if err != nil {
return err
}
b.bits[bi] = byte(in)
}
case []byte:
str := string(s)
length := len(str)
b.size = length * 4
b.bits = make([]byte, (b.size/8)+1)
for i := 0; i < length; i += 2 {
bi := (length - i) / 2
by := str[i : i+2]
in, err := strconv.ParseUint(by, 16, 0)
if err != nil {
return err
}
b.bits[bi] = byte(in)
}
case int:
}
return nil
}
// Value implements the driver Valuer interface.
func (b BitMap) Value() (driver.Value, error) {
return nil, nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。