diff options
author | eug-vs <eugene@eug-vs.xyz> | 2022-09-14 17:44:42 +0300 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2022-09-14 17:45:22 +0300 |
commit | 71f28db1b8e26377d56f0eb0aef01f6c6c3afbd0 (patch) | |
tree | 0e7ad0fd5a6e1c5df73c9d9b34e68d67d9a449d1 | |
parent | 1373e30387bf5e8e7858e10c9dee4413bf20d71c (diff) | |
download | j1chess-71f28db1b8e26377d56f0eb0aef01f6c6c3afbd0.tar.gz |
feat: implement bitscanAndReset
-rw-r--r-- | src/bitboard.c | 9 | ||||
-rw-r--r-- | src/bitboard.h | 4 | ||||
-rw-r--r-- | src/main.c | 4 |
3 files changed, 15 insertions, 2 deletions
diff --git a/src/bitboard.c b/src/bitboard.c index e9a7d53..cffe40f 100644 --- a/src/bitboard.c +++ b/src/bitboard.c @@ -25,6 +25,13 @@ inline Bitboard ls1b(Bitboard bb) { /* Log base 2 (aka Trailing Zero Count) * Only works for SINGLE Bitboards * Useful for calculating bit-index of LS1B */ -inline Bitboard bitscan(Bitboard bb) { +inline int bitscan(Bitboard bb) { return pop_count(ls1b(bb) - 1); } + +/* Bitscan forward with LS1B reset */ +inline int bitscanAndReset(Bitboard* bb) { + int idx = bitscan(*bb); + *bb &= *bb - 1; + return idx; +} diff --git a/src/bitboard.h b/src/bitboard.h index b90bd8f..ebac2f7 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -9,4 +9,6 @@ void print_bitboard(Bitboard bb); Bitboard ls1b(Bitboard bb); -Bitboard bitscan(Bitboard bb); +int bitscan(Bitboard bb); + +int bitscanAndReset(Bitboard* bb); @@ -5,6 +5,10 @@ int main() { start_test_section("Bitboards"); { unit_test(pop_count(0b01110) == 3, "Pop count of 01110 is 3"); + + Bitboard bb = 0b1100; + unit_test(bitscanAndReset(&bb) == 2, "Bitscan of 0b1100 is 2"); + unit_test(bb == 0b1000, "After bitscan with reset the LS1B is flipped"); } start_test_section("Default FEN string"); { |