introduce bitloops

This commit is contained in:
mike
2026-01-14 09:59:24 +01:00
parent 1a56297986
commit 69af69a8b8
3 changed files with 36 additions and 32 deletions

View File

@@ -286,17 +286,17 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
/// the pos will never target a clue
public byte letter32At(int pos) { return g[pos]; }
void setLetterLo(int idx, byte ch) {
lo &= ~(1L << idx);
lo |= (1L << idx);
g[idx] = ch;
}
void setLetterHi(int idx, byte ch) {
hi &= ~(1L << idx & 63);
hi |= (1L << (idx & 63));
g[idx] = ch;
}
void setLetter(int idx, byte ch) {
if ((idx & 64)==0)
if ((idx & 64) == 0)
setLetterLo(idx, ch);
else
setLetterHi(idx, ch);
@@ -305,12 +305,12 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
private void clearletterLo(int idx) {
g[idx] = DASH;
lo |= (1L << idx);
lo &= ~(1L << idx);
}
private void clearletterHi(int idx) {
g[idx] = DASH;
hi |= (1L << idx & 63);
hi &= ~(1L << (idx & 63));
}
void undoPlace(long maskLo, long maskHi) {
for (long b = maskLo; b != 0; b &= b - 1) clearletterLo(Long.numberOfTrailingZeros(b));
@@ -747,45 +747,37 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
}
static long patternForSlot(Grid grid, Slot s) {
if ((s.lo & ~grid.lo) == 0 && (s.hi & ~grid.hi) == 0) {
if ((s.lo & grid.lo) == 0 && (s.hi & grid.hi) == 0) {
return 0;
}
long p = 0;
if (s.increasing()) {
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
for (long b = s.lo & grid.lo; b != 0; b &= b - 1) {
int idx = Long.numberOfTrailingZeros(b);
byte val = grid.g[idx];
if (val != DASH) {
int i = Long.bitCount(s.lo & ((1L << idx) - 1));
p |= ((long) (i * 26 + val)) << (i << 3);
}
int i = Long.bitCount(s.lo & ((1L << idx) - 1));
p |= ((long) (i * 26 + val)) << (i << 3);
}
int offset = Long.bitCount(s.lo);
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
for (long b = s.hi & grid.hi; b != 0; b &= b - 1) {
int idx = Long.numberOfTrailingZeros(b);
byte val = grid.g[64 | idx];
if (val != DASH) {
int i = offset + Long.bitCount(s.hi & ((1L << idx) - 1));
p |= ((long) (i * 26 + val)) << (i << 3);
}
int i = offset + Long.bitCount(s.hi & ((1L << idx) - 1));
p |= ((long) (i * 26 + val)) << (i << 3);
}
} else {
int offset = Long.bitCount(s.hi);
for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) {
for (long b = s.hi & grid.hi; b != 0; b &= b - 1) {
int idx = Long.numberOfTrailingZeros(b);
byte val = grid.g[64 | idx];
if (val != DASH) {
int i = Long.bitCount(s.hi & ~((1L << idx) | ((1L << idx) - 1)));
p |= ((long) (i * 26 + val)) << (i << 3);
}
int i = Long.bitCount(s.hi & ~((1L << idx) | ((1L << idx) - 1)));
p |= ((long) (i * 26 + val)) << (i << 3);
}
for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) {
for (long b = s.lo & grid.lo; b != 0; b &= b - 1) {
int idx = Long.numberOfTrailingZeros(b);
byte val = grid.g[idx];
if (val != DASH) {
int i = offset + Long.bitCount(s.lo & ~((1L << idx) | ((1L << idx) - 1)));
p |= ((long) (i * 26 + val)) << (i << 3);
}
int i = offset + Long.bitCount(s.lo & ~((1L << idx) | ((1L << idx) - 1)));
p |= ((long) (i * 26 + val)) << (i << 3);
}
}
return p;