/* Unpack a raw coord to a cube */ private void unpack(EdgeCubies cube) { int ledge4of8 = raw_coord % 70; int edge = raw_coord / 70; int redge4of8 = edge % 70; edge /= 70; int perm6_fb = edge % 6; int perm6_rl = edge / 6; byte[] t = new byte[4]; int i1 = 0; int i2 = 0; int r = 4; Util.set4Perm(t, perm6_rl); for (int i = 7; i >= 0; i--) { if (ledge4of8 >= Util.Cnk[i][r]) { ledge4of8 -= Util.Cnk[i][r--]; cube.cubies[i + 4] = (byte) (t[i1++] + 4); } else cube.cubies[i + 4] = (byte) ((i2++) + 8); } i1 = 0; i2 = 0; r = 4; Util.set4Perm(t, perm6_fb); for (int i = 7; i >= 0; i--) { if (redge4of8 >= Util.Cnk[i][r]) { redge4of8 -= Util.Cnk[i][r--]; cube.cubies[(i < 4) ? i : i + 8] = (byte) (i1++); } else cube.cubies[(i < 4) ? i : i + 8] = (byte) (t[i2++] + 12); } for (int i = 16; i < 24; i++) cube.cubies[i] = (byte) i; }