Algoritmo de clasificación de radix

Me han dado algunos algoritmos para realizar ingeniería inversa. El siguiente algoritmo es de tipo radix, pero estoy muy confundido acerca de lo que realmente está sucediendo en el código.

Soy nuevo en algoritmos y no estoy seguro de cómo el código clasifica los elementos en una matriz. No estoy seguro de qué bits tienen que ver con el algoritmo y qué es una máscara. Aquí está el código:

    ArrayList<Integer> array = CopyArray(a);
    Integer[] zerobucket = new Integer[a.size()];
    Integer[] onebucket = new Integer[a.size()];
    int i, bit;
    Integer element, mask;

    for (bit=0; bit<8; ++bit) {
        int zc = 0;
        int oc = 0;

        for(i=0; i<array.size(); ++i) {
            element = array.get(i);
            mask = 1 << bit;
            if ((element & mask) == 0) {
                zerobucket[zc++] = array.get(i);
            } else {
                onebucket[oc++] = array.get(i);
            }
        }
        for(i=0; i<oc; ++i) array.set(i,onebucket[i]);
        for(i=0; i<zc; ++i) array.set(i+oc,zerobucket[i]);
    }
    return(array);

Respuestas a la pregunta(4)

Su respuesta a la pregunta