Maneira rápida de remover bits de um ulong

Quero remover bits de uma cadeia de 64 bits (representada por um longo sem sinal). Eu poderia fazer isso com uma sequência de operações de máscara e deslocamento ou iterar sobre cada bit, como no código abaixo. Existe algum método inteligente de manipulação de bits para tornar o desempenho mais rápido?

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;
}

Eu preciso realizarRemoveBits milhões de vezes em um cenário crítico de desempenho.

Provavelmente é muito abstrato para ajudar, mas o número de máscaras distintas usadas, embora não seja conhecido no momento da compilação, é determinado cedo no tempo de execução (antes do bit crítico de desempenho) e provavelmente é menor que 100. Essencialmente, estou usando a cadeia de bits para representar umn-tupleeRemoveBits projetos em umm-tuple (m < n).

questionAnswers(3)

yourAnswerToTheQuestion