2016-07-08 4 views
0

たとえば、符号なしlong(64ビット)配列で表される2つのビットマップがあるとします。そして、私はこの2つのビットマップを特定のシフト(オフセット)を使ってマージしたいと思います。 たとえば、ビットマップ1(より大きい)をビットマップ2(より小さい)の開始オフセット3にマージします。オフセット3は、ビットマップ1の3番目のビットがビットマップ2の0ビットに対応することを意味します。 マージするとは、論理OR演算を意味します。これを行う最もクリーンな方法は何ですか?2つのビットマップを特定のシフト(オフセット)とマージする方法は?

現在、私は(C/C++/C#は受け入れ)ループ

const ulong BitsPerUlong = 64; 



    MergeAt(ulong startIndex, Bitmap bitmap2) 
    { 
      for (int i = startIndex; i < bitmap2.Capacity; i++) 
      { 
       bool newVal = bitmap2.GetAt(i) | bitmap1.GetAt(i) 
       bitmap2.SetAt(i, newVal) 
      } 

     } 

    bool GetAt(ulong index) 
    { 
     var dataOffset = BitOffsetToUlongOffset(index); 
     ulong mask = 0x1ul << ((int)(index % BitsPerUlong)); 

     return (_data[dataOffset] & mask) == mask; 
    } 

    void SetAt(ulong index, bool value) 
    { 
     var dataOffset = BitOffsetToUlongOffset(index); 
     ulong mask = 0x1ul << ((int)(index % BitsPerUlong)); 

     if (value) 
     { 
      _data[dataOffset] |= mask; 
     } 
     else 
     { 
      _data[dataOffset] &= ~mask; 
     } 
    } 

    ulong BitOffsetToUlongOffset(ulong index) 
    { 
     var dataOffset = index/BitsPerUlong; 

     return dataOffset; 
    } 

するための単純なuneffectiveでこれを行っています。

+0

あなたの試行を表示できますか?いくつかの擬似コード、または実装。私は2つの配列の上に単純なループが十分だろうと思う – Houbie

+0

@ SimonHoubracken done –

答えて

-1

私はあなたがより小さいINTOをより大きなものに "マージ"したいと思っています。

お試しください:bitmapLarger | =(bitmapSmaller < < 3)?あなたはおそらく自分で考え出したよう

+0

配列はbitshift操作をサポートしていません...彼らはありませんか? –

0

offset < BitsPerULong場合は、最初のブロックはと合併することができます:data2[0]にマージされていないいくつかのビットを残し

data1[0] |= data2[0] << offset; 

が、あなたは持つものを得ることができます。

data2[0] >> (BitsPerULong - offset) 

をしたがって、i > 0の次のマージは次のようになります。

data1[i] |= (data2[i] << offset) | (data2[i-1] >> (BitsPerULong - offset)); 

からforループを構築してすべてのデータをマージすることができます。もちろん、これはまだdata2の2ビットが「落ちる」ことを意味しますが、それはあなたの問題記述に固有のものだと思いますか?

offsetBitsPerULongより大きい可能性があるより汎用的なソリューションが必要な場合は、もう少し作業が必要です。

+0

私はジェネリックを必要とし、私は何かエレガントなものを埋める... –

関連する問題