Schneller Weg, um Bits aus einem ulong zu entfernen
Ich möchte Bits aus einer 64-Bit-Zeichenfolge entfernen (dargestellt durch ein vorzeichenloses Long). Ich könnte dies mit einer Sequenz von Masken- und Verschiebevorgängen tun oder jedes Bit wie im folgenden Code durchlaufen. Gibt es eine clevere Bit-Twiddling-Methode, mit der dies schneller durchgeführt werden kann?
public ulong RemoveBits(ulong input, ulong mask)
{
ulong result = 0;
ulong readbit = 1;
ulong writebit =1;
for (int i = 0; i < 64; i++)
{
if ((mask & readbit) == 0) //0 in the mask means retain that bit
{
if ((input & readbit) > 0)
{
result+= writebit;
}
writebit*=2;
}
readbit *= 2;
}
return result;
}
Ich muss durchführenRemoveBits
Millionen Mal in einem leistungskritischen Szenario.
Es ist wahrscheinlich zu abstrakt, um zu helfen, aber die Anzahl der verwendeten Masken wird, obwohl sie zur Kompilierungszeit nicht bekannt sind, früh zur Laufzeit (vor dem leistungskritischen Bit) bestimmt und ist wahrscheinlich kleiner als 100. Im Wesentlichen verwende ich die Bitfolge, die einen-tuple
, undRemoveBits
Projekte auf einem-tuple
(m < n)
.