たとえば、符号なし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でこれを行っています。
あなたの試行を表示できますか?いくつかの擬似コード、または実装。私は2つの配列の上に単純なループが十分だろうと思う – Houbie
@ SimonHoubracken done –