Square pop_1st_bit(Bitboard* bb) {
- b_union u;
+ b_union* u;
Square ret;
- u.b = *bb;
+ u = (b_union*)bb;
- if (u.dw.l)
+ if (u->dw.l)
{
- ret = Square(BitTable[((u.dw.l ^ (u.dw.l - 1)) * 0x783a9b23) >> 26]);
- u.dw.l &= (u.dw.l - 1);
- *bb = u.b;
+ ret = Square(BitTable[((u->dw.l ^ (u->dw.l - 1)) * 0x783a9b23) >> 26]);
+ u->dw.l &= (u->dw.l - 1);
return ret;
}
- ret = Square(BitTable[((~(u.dw.h ^ (u.dw.h - 1))) * 0x783a9b23) >> 26]);
- u.dw.h &= (u.dw.h - 1);
- *bb = u.b;
+ ret = Square(BitTable[((~(u->dw.h ^ (u->dw.h - 1))) * 0x783a9b23) >> 26]);
+ u->dw.h &= (u->dw.h - 1);
return ret;
}
#endif
+int bitScanReverse32(uint32_t b)
+{
+ int result = 0;
+
+ if (b > 0xFFFF) {
+ b >>= 16;
+ result += 16;
+ }
+ if (b > 0xFF) {
+ b >>= 8;
+ result += 8;
+ }
+ if (b > 0xF) {
+ b >>= 4;
+ result += 4;
+ }
+ if (b > 0x3) {
+ b >>= 2;
+ result += 2;
+ }
+ return result + (b > 0) + (b > 1);
+}
+
namespace {
// All functions below are used to precompute various bitboards during