ビットマップアルゴリズムは、オンラインで多くの情報を紹介し、さまざまな言語を達成するために、ここでそれらを繰り返さない多くのですが、多くはないが行くのバージョンを実装するビットマップを書き込むためのビットマップ、紙の言語バージョンを移動します。
まず、作成したビットマップを。、ファイルを移動します定義するビットマップの構造を、いくつかの動作方法を提供します。次のように詳細なコードは次のとおりです。
ビットマップパッケージ のインポート( "FMT" "文字列" ) CONST( ビットサイズ= 8 ) VARビットマスク= [] {バイト1 ,. 1. 1 <<、<< 1 2 ,. 1. 3 <<、<<。1. 4 ,. 1. 5 << 。。、6 << 1 ,. 1. 7} << タイプstruct {ビットマップ ビットは[]、バイト BITCOUNT UInt64型//桁数が充填された 容量UINT64 //容量 } FUNC NewBitmap(MAXNUM UInt64型)*ビットマップ{ リターン{&ビットマップ・ビット:メイク([]バイト、(+ MAXNUM 7)/ビットサイズ)、BITCOUNT:0、容量:MAXNUM} } //番号入力 FUNC(このビットマップ*)セット(NUM UInt64型){ byteIndex、BITPOS:= this.offset(NUMを) // BITPOSを1に設定1ビット又はビット()左 これを。ビット[byteIndex] | =ビットマスク[BITPOS] ++ this.bitCount ++ BITCOUNT } //クリアデジタルいっぱい FUNC(このビットマップ*)リセット(NUM UInt64型){ byteIndex、BITPOS:= this.offset(NUM) //リセットギャップ(0にリセット) this.bits [byteIndex] = ^&ビットマスク[BITPOS ] this.bitCount-- } //デジタルビットマップなら FUNC(このビットマップ*)テスト(NUM UInt64型){BOOL byteIndex:NUM = /ビットサイズ のiF byteIndex> UInt64型=(LEN(this.bits)){ falseに戻します } BITPOS:NUM =%ビットサイズ // BITPOSは右シフトとビット単位の1ビット リターン(this.bits [byteIndex]&ビットマスク[BITPOS] == 0)! } FUNC(このビットマップ*)オフセット(NUM UInt64型)(byteIndexをUInt64型、BITPOSバイト){ byteIndex NUM = / //バイトインデックスビットサイズ byteIndex IF> = UInt64型(LEN(this.bits)){ パニック(fmt.Sprintf( "ランタイムエラー:%のD OUT範囲のインデックス値"、byteIndex)) リターン } BITPOS =バイト(NUM%ビットサイズ)//「のビット位置 戻りbyteIndex、BITPOS } //ビットマップ容量 FUNC(このビットマップ*)サイズ(){UINT64 戻りUInt64型(LEN(this.bits)*ビットサイズ) } //もし空孔図の FUNC(この*ビットマップ)のisEmpty( )BOOL { this.bitCount == 0戻る } //充填された IsFully(){BOOL FUNC(この*ビットマップ)を リターンthis.bitCount == this.capacity } //桁数が充填された FUNC(この*ビットマップを)カウント(){UINT64 this.bitCountを返します } //获取填入的数字切片 FUNC(この*ビットマップ)のGetData()] UINT64 { VARデータ[] UINT64 数:= this.Size() インデックスの:= UINT64(0)。インデックス<数えます。インデックス++ { もしthis.Test(インデックス){ データ=追加(データ、インデックス) } } 戻りデータ } FUNC(この*ビットマップ)文字列()文字列{ VAR SB strings.Builder インデックスの:= LEN(this.bits) - 1; インデックス> = 0; index-- { sb.WriteString(byteToBinaryString(this.bits [インデックス])) sb.WriteStringは、(」「) } sb.String()戻り } FUNC byteToBinaryString(データバイト)の文字列{ VAR SB strings.Builderを インデックスの:= 0; インデックス<ビットサイズ。インデックス++ { (ビットマスク[7-インデックス]&データ)== 0 {場合 sb.WriteString( "0") 他} { sb.WriteString( "1") } } )(sb.Stringを返します }
コード内のコメントがありますが、理解しやすいです。以下の書き込みテストコードは、ビットマップをテストします。
主パッケージ のインポート( "ビットマップ" "FMT" ) FUNCメイン(){ 配列:= [...] UInt64型{0 ,. 6 ,. 3 ,. 7,2 ,. 8 ,. 1 ,. 4} VAR 9 MAXNUM UInt64型= BM = bitmap.NewBitmap(MAXNUM) _ため、V:配列= {範囲 bm.Set(V) } (5)bm.Set fmt.Println(bm.IsFully()) fmt.Println(bm.IsEmpty()) FMT。 println( "ビットマップ番号が存在する:") fmt.Println(bm.GetData()) fmt.Println( "ビットマップバイナリ文字列") fmt.Println(bm.String()) でfmt.Println(」ビットマップ桁数: "bm.Count()) fmt.Println("ビットマップのサイズ: "bm.Size()) fmt.Println("テスト(0): "、Bm.Test(0)) 。bm.Reset(5) FMT。println(bm.String()) fmt.Println( "テスト(5):"、bm.Test(5)) fmt.Println(bm.GetData()) }
出力テストコードは次のとおりです。
trueに
falseに
本ビットマップの数値
[0 2. 3. 1. 4. 5. 6. 7. 8]
ビットマップバイナリストリング
0,000,000,111,111,111
ビットマップ:. 9の桁数
のビットマップサイズ:16
テスト(0):trueに
00000001 11011111
(5)試験:falseに
[0 1 4 3 2 6 7 8]
要約最後に、ビットマップの実装コードは、必要に応じて他のプロセスは、本明細書に参照の実装に加えてもよいです。スレッドセーフではないコードのほかのテキストでは、複数のスレッドを使用してロックする必要があります。