Forma rápida de eliminar bits de un ulong

Quiero eliminar bits de una cadena de 64 bits (representada por un largo sin signo). Podría hacer esto con una secuencia de operaciones de máscara y desplazamiento, o iterar sobre cada bit como en el código a continuación. ¿Existe algún método inteligente para hacer que esto funcione más 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;
}

Necesito realizarRemoveBits millones de veces en un escenario crítico de rendimiento.

Probablemente sea demasiado abstracto para ayudar, pero el número de máscaras distintas utilizadas, aunque no se conoce en el momento de la compilación, se determina temprano en el tiempo de ejecución (antes del bit crítico de rendimiento), y es probable que sea inferior a 100. Básicamente, estoy usando la cadena de bits para representar unn-tupleyRemoveBits proyectos en unm-tuple (m < n).

Respuestas a la pregunta(3)

Su respuesta a la pregunta