Ajuda: Como expandir um iterator dentro de um loop?

Olá pessoal, tenho o seguinte código

private static Set<Integer> ex = new HashSet<Integer>();
    private static void func(){
        ex.add(Integer.valueOf(64));
        int c=0;
        do{
            c=ex.size();
            for (Integer in : ex)
                if (in>2)
                       ex.add(in/2);
        }while (ex.size()!=c);
     }

É o seguinte: tenho um set de integer, nele coloco o valor 64, minha idéia é fazer um loop para que as metades dos valores maiores q 2 contidos no set sejam inseridos no set.
O problema é que ele da o erro de ConcurrentModificationException.
Pelo que andei olhando teria que usar algo com synchronized, tentei alguma coisa mas não mudou nada.

O código é meio idióta, mas tenho que fazer assim.

Alguém tem alguma sugestão de como solucionar essa questão de expandir o conjunto no qual se está iterando?

Grato.

EDIT - Por favor use os tags [ code ] para postar código.

Se você precisa mesmo trabalhar com Set, a solução criar um para iteração e outro(s) para manipulação. Caso contrário (e se performance não for um problema) você pode usar um List e um ListIterator. Este último provê um método add() que insere um objeto na posição seguinte à corrente.

O melhor é você usar um Set intermediário, adicionar os valores desejados nesse loop, e a seguir usar addAll. Veja como você poderia fazer isso.

private static Set<Integer> getNewElements (Set<Integer> input) {
    Set<Integer> output = new HashSet<Integer>();
    for (Integer x : input) {
        output.add (x / 2);
    }
    return output;
}

private static Set<Integer> func () {
    Set<Integer> ex = new HashSet<Integer>();
    ex.add (64);
    int c = 0;
    do {
        Set<Integer> newElements = getNexElements (ex);
        ex.addAll (newElements);
        c = newElements.size();
    } while (c > 0);
    return ex;
}