Un bitboard est une structure de données spécialisée sous la forme d’un tableau de bits, utilisée dans les systèmes informatiques de jeux de plateau. Chaque bit d’un bitboard correspond à une case ou à une pièce du plateau, ce qui permet d’effectuer en parallèle des opérations bit-à-bit (AND, OR, XOR, etc.) pour mettre à jour ou interroger l’état du jeu, calculer des déplacements ou tester des positions.
Les bits d’un même bitboard sont liés entre eux par les règles du jeu : pris isolément ils indiquent une propriété locale (présence d’une pièce, case menacée, etc.), et pris dans leur ensemble ils forment une représentation compacte d’une position. D’autres bitboards — souvent utilisés comme masques — servent à transformer ou à interroger des positions de manière « vectorisée ». La technique s’applique à tout jeu dont l’état se résume à la présence ou à l’absence de pièces sur un ensemble fini de cases, et constitue une alternative très efficace à la représentation « mailbox » (tableau d’objets) traditionnelle, où chaque case ou pièce est stockée séparément.
Les bitboards sont performants lorsque le nombre de bits utilisés correspond à la taille d’un mot machine ou d’un double-mot (par exemple 64 bits sur processeurs modernes), car une seule instruction peut traiter simultanément l’ensemble des bits.
Parmi les jeux utilisant des bitboards, on peut citer les échecs, les dames, l’othello (reversi) ou certains jeux de lettres. La méthode a été employée dès les années 1950 dans des programmes de dames, et, depuis le milieu des années 1970, est devenue une référence pour la représentation de plateaux en intelligence artificielle ludique.
Un bitboard est en fait un champ de bits (bit field) qui regroupe plusieurs variables booléennes connexes dans un seul mot machine. Chaque bit représente une case : si le bit vaut 1, la propriété associée à cette case est vraie (présence d’une pièce, case centrale, case attaquée, etc.).
Grâce aux opérations logiques sur mots entiers, on peut répondre à certaines questions en une seule instruction. Par exemple, pour savoir si un joueur d’échecs possède un pion dans les quatre cases centrales, on effectue un AND entre le bitboard des pions et celui des cases centrales ; si le résultat est nul, aucun pion n’occupe cette zone.
On peut multiplier les bitboards pour représenter différentes catégories de pièces, différents joueurs, ou encore des propriétés statiques (cases de coin, rangée initiale, etc.). Des bitboards temporaires servent parfois à stocker des résultats intermédiaires ou des masques locaux.
La mise en œuvre des bitboards exige généralement :
Pour éviter de régénérer intégralement tous les bitboards dérivés (attaques, cases vulnérables, etc.) à chaque coup, on met à jour uniquement les masques affectés par le déplacement (source et destination). Cette approche requiert un code précis et finement optimisé, mais se révèle beaucoup plus rapide que la reconstruction complète.
Certaines informations indépendantes de la configuration courante (par exemple la carte d’attaques d’un cavalier ou d’un roi depuis chaque case) sont calculées une fois pour toutes et stockées en table. On y accède ensuite par une simple lecture mémoire, ce qui rend quasi-instantanées des opérations qui, autrement, impliqueraient une énumération de mouvements légaux.

Le plateau d’échecs, aux 64 cases, se prête naturellement à une représentation par un mot de 64 bits. La convention la plus répandue associe le bit 0 à la case a1, le bit 7 à h1, le bit 56 à a8 et le bit 63 à h8.
On maintient généralement plusieurs bitboards :
Les attaques des pièces non glissantes (cavalier, roi) sont directement issues des tables pré-calculées. En revanche, les pièces glissantes (fou, tour, dame) nécessitent un calcul dynamique complexe, car leur portée dépend de l’occupation intermédiaire du plateau.
Chaque bitboard correspond à une configuration précise (positions des pions blancs, cases des pièces noires, etc.). Par exemple, pour déterminer si une pièce est « en prise », on croise le bitboard des cases défendues avec celui des cases attaquées.
Pour accélérer le calcul des attaques des pièces glissantes, plusieurs techniques « avancées » sont disponibles :
On fait pivoter la représentation d’occupation du plateau de 90 °, 45 ° ou –45 ° pour transformer les attaques sur colonnes/diagonales en attaques sur rangées, indexables par table. Chaque rotation implique un traitement en dizaines d’instructions, mais remplace de longues séquences de masques et décalages.
On masque séparément la rangée, la colonne et les deux diagonales pour extraire 8 bits d’occupation, qui servent d’index dans des tables de hachage de taille modérée (quelques kilo-octets). On combine ensuite les résultats pour obtenir l’ensemble des cases attaquées.
S’appuyant sur le principe du hachage parfait, on construit des « magics » (constantes multiplicatives et décalages) qui, appliqués à l’occupation masquée, donnent directement l’index de la table des attaques. Les tables peuvent rester volumineuses (plusieurs centaines de milliers d’entrées), avec un risque de surcharger le cache L1/L2, si bien que ce schéma n’est pas toujours plus rapide que les rotations ou le hachage direct.
La méthode du bitboard est apparue dès le milieu des années 1950 dans le programme de dames d’Arthur Samuel. Pour les échecs, elle a été redécouverte à la fin des années 1960 par l’équipe Kaissa en URSS, puis au début des années 1970 par le programme Northwestern University Chess. L’essor des architectures 64 bits a accéléré son adoption.
Les bitboards tournés ont été imaginés dans les années 1990 par Robert Hyatt (Cray Blitz, Crafty). Les techniques de hachage et les bitboards magiques sont quant à elles apparues dans les années 2000, avec des gains variables selon les plates-formes et la taille du cache.