class RegisterSet {

    public void merge(RegisterSet that)
    {
        for (int bucket = 0; bucket < M.length; bucket++)
        {
            int word = 0;
            for (int j = 0; j < LOG2_BITS_PER_WORD; j++)
            {
                int mask = 0x1f << (REGISTER_SIZE * j);

                int thisVal = (this.M[bucket] & mask);
                int thatVal = (that.M[bucket] & mask);
                word |= (thisVal < thatVal) ? thatVal : thisVal;
            }
            this.M[bucket] = word;
        }
    }

    public  RegisterSet(int count);
    public  RegisterSet(int count, int[] initialValues);

}