Algoritmo de Classificação Radix

Me deram alguns algoritmos para fazer engenharia reversa. O algoritmo abaixo é uma classificação radical, mas estou muito confuso sobre o que realmente está acontecendo no código.

Eu sou novo em algoritmos e não tenho certeza de como o código classifica elementos em uma matriz. Não sei ao certo o que os bits têm a ver com o algoritmo e o que é uma máscara. Aqui está o 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);

questionAnswers(4)

yourAnswerToTheQuestion