TODO: gray code