言語のビットマップアルゴリズムを行きます

ビットマップアルゴリズムは、オンラインで多くの情報を紹介し、さまざまな言語を達成するために、ここでそれらを繰り返さない多くのですが、多くはないが行くのバージョンを実装するビットマップを書き込むためのビットマップ、紙の言語バージョンを移動します。

まず、作成したビットマップを。、ファイルを移動します定義するビットマップの構造を、いくつかの動作方法を提供します。次のように詳細なコードは次のとおりです。

ビットマップパッケージ

のインポート(
    "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]

要約最後に、ビットマップの実装コードは、必要に応じて他のプロセスは、本明細書に参照の実装に加えてもよいです。スレッドセーフではないコードのほかのテキストでは、複数のスレッドを使用してロックする必要があります。

おすすめ

転載: www.cnblogs.com/aiandbigdata/p/11432310.html