return occupancy;
}
void init_sliders_attacks(int bishop) {
for (int square = 0; square < 64; square++) {
U64 attack_mask;
if (bishop) {
bishop_masks[square] = mask_bishop_attacks(square);
attack_mask = bishop_masks[square];
} else {
rook_masks[square] = mask_rook_attacks(square);
attack_mask = rook_masks[square];
}
int relevant_bits = bit_count(attack_mask);
int occupancy_indicies = 1 << relevant_bits;
for (int index = 0; index < occupancy_indicies; index++) {
U64 occupancy = set_occupancy(index, relevant_bits, attack_mask);
if (bishop) {
int magic_index = (occupancy * bishop_magic_numbers[square]) >>
(64 - bishop_relevant_bits[square]);
bishop_attacks[square][magic_index] =
bishop_attacks_on_the_fly(square, occupancy);
} else {
int magic_index = (occupancy * rook_magic_numbers[square]) >>
(64 - rook_relevant_bits[square]);
rook_attacks[square][magic_index] =
rook_attacks_on_the_fly(square, occupancy);
}
}
}
}
static inline U64 get_bishop_attacks(int square, U64 occupancy) {
occupancy &= bishop_masks[square];
occupancy *= bishop_magic_numbers[square];
occupancy >>= 64 - bishop_relevant_bits[square];
return bishop_attacks[square][occupancy];
}
static inline U64 get_rook_attacks(int square, U64 occupancy) {
occupancy &= rook_masks[square];
occupancy *= rook_magic_numbers[square];
occupancy >>= 64 - rook_relevant_bits[square];
return rook_attacks[square][occupancy];
}
// magic numbers
U64 generate_magic_number() {