有關bitmap演算法的介紹資料網上很多,這裡不贅述,各種語言的實現也不少,但是go語言版的bitmap不多,本文就來寫乙個go版的bitmap實現。
首先建立乙個 bitmap.go 檔案,定義乙個bitmap結構體,再提供一些操作方法。詳細**如下:
package bitmapimport (
"fmt"
"strings"
)const (
bitsize = 8
)var bitmask = byte
// 首字母小寫 只能呼叫 工廠函式 建立
type bitmap struct
// 建立工廠函式
func newbitmap(maxnum uint64) *bitmap
}// 填入數字
func (this *bitmap) set(num uint64)
// 清除填入的數字
func (this *bitmap) reset(num uint64)
// 數字是否在位圖中
func (this *bitmap) test(num uint64) bool
bitpos := num % bitsize
// 右移 bitpos 位 和 1 進行 按位與
return !(this.bits[byteindex]&bitmask[bitpos] == 0)
}func (this *bitmap) offset(num uint64) (byteindex uint64, bitpos byte)
bitpos = byte(num % bitsize) // bit位置
return byteindex, bitpos
}// 點陣圖的容量
func (this *bitmap) size() uint64
// 是否空位圖
func (this *bitmap) isempty() bool
// 是否已填滿
func (this *bitmap) isfully() bool
// 已填入的數字個數
func (this *bitmap) count() uint64
// 獲取填入的數字切片
func (this *bitmap) getdata() uint64
}return data
}func (this *bitmap) string() string
return sb.string()
}func bytetobinarystring(data byte) string else
}return sb.string()
}
**中有注釋,很容易看懂。下面寫測試**,測試這個bitmap。
package mainimport (
"bitmap"
"fmt"
)func main()
var maxnum uint64 = 9
bm := bitmap.newbitmap(maxnum)
for _, v := range array
bm.set(5)
fmt.println(bm.isfully())
fmt.println(bm.isempty())
fmt.println("bitmap 中存在的數字:")
fmt.println(bm.getdata())
fmt.println("bitmap 中的二進位制串")
fmt.println(bm.string())
fmt.println("bitmap 中的數字個數:", bm.count())
fmt.println("bitmap size:", bm.size())
fmt.println("test(0):", bm.test(0))
bm.reset(5)
fmt.println(bm.string())
fmt.println("test(5):", bm.test(5))
fmt.println(bm.getdata())
}
測試**的輸出如下:
truefalse
bitmap 中存在的數字:
[0 1 2 3 4 5 6 7 8]
bitmap 中的二進位制串
00000001 11111111
bitmap 中的數字個數: 9
bitmap size: 16
test(0): true
00000001 11011111
test(5): false
[0 1 2 3 4 6 7 8]
c語言實現bitmap
bit.h ifndef bit h define bit h 儲存bitmap的結構體 儲存的順序從左至右 struct bits typedef struct bits bits 獲得bitmap length bitmap的長度 return 所有位都初始化為0的bitmap bits bit...
LRU演算法的GO語言實現
lru演算法原理,來自 1.假設我們使用雜湊鍊錶來快取使用者資訊,目前快取了4個使用者,這4個使用者是按照時間順序依次從鍊錶右端插入的 2.此時,業務方訪問使用者5,由於雜湊鍊錶中沒有使用者5的資料,我們從資料庫中讀取出來,插入到快取當中。這時候,鍊錶中最右端是最新訪問到的使用者5,最左端是最近最少...
Go語言實現 常見排序演算法
氣泡排序 時間複雜度 o n 2 穩定性 穩定 氣泡排序 相鄰兩位交換,12交換,23交換,34交換,把最大的數放到最右邊 利用flag標記可以避免無效迴圈 func bubblesort arr int true表示序列已經有序,直接退出,不用繼續迴圈 false表示本次迴圈發生了交換,需要繼續判...