ç°¡åãªèª¬æ
ãã®èšäºã§ã¯ãããããããŒããïŒåãããã1ã€ã®ãã§ãã«ãŒããŒããã£ãŒã«ããè¡šã64ãããæŽæ°ïŒã䜿çšããå Žåã®ãã¥ã¢ã³ã¹ã«ã€ããŠèª¬æããŸãã 1994幎ããã¥ãŒãžã£ãŒãžãŒå·ã±ãŒãã¡ã€ã§ACMãäž»å¬ãããã§ã¹ã·ã³ããžãŠã ã®åŸãç§ã¯Cray BlitzïŒCrayã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒçšã«Robert HyattãHarry NelsonãAlbert Goverã«ãã£ãŠæžãããã³ã³ãã¥ãŒã¿ãŒããã°ã©ã ïŒãå®å šã«çœ®ãæããããšã«ããŸããã翻蚳ãïŒã ç§ã¯ãã§ã¹4.xïŒã€ãªãã€å·ããŒã¹ãŠã§ã¹ã¿ã³å€§åŠã§éçºããã20äžçŽã®70幎代ã«æ¯é ããããã§ã¹ããã°ã©ã -çŽç¿»èš³ïŒã§ãã¹ãããããããããŒãæ³ãè©ŠããŠã¿ãããšã«èå³ããããŸããããã§ã¹ã«é©ããŠãããã©ãããèªåã§æ±ºããŠãã ããã ãã®æ°ããããã°ã©ã ã®éçºäžã«ããå転å¯èœãªãããããŒããã®æŠå¿µãèæ¡ããããã®ã¿ã€ãã®ããŒã¿æ§é ã蚱容å¯èœãªããã©ãŒãã³ã¹ã§åäœãããããã«å¿ èŠãªããšãå€æããŸããã
1.ã¯ããã«
ãããããŒãã¯ãã³ã³ãã¥ãŒã¿ãŒãã§ã¹ã®æç®ã§äœåºŠãèšåãããŠããŸãã 1970幎代åã°ã«ãã¹ã¬ãŒããšã¢ããã³ã¯12åã®64ãããæŽæ°ã䜿çšããæ¹æ³ãæãã€ãã説æããŸãããåæŽæ°ã¯ããã§ã¹ç€äžã®1çš®é¡ã®ãã§ã¹ã®é§ïŒçœã¯6åãé»ã¯6åïŒãè¡šããŸããã ããã§ã¯ãKAISSAããŒã ïŒDonskoyãªã©ïŒããããŒã¹ãŠã§ã¹ã¿ã³å€§åŠã®ããŒã ãšã¯ç¬ç«ããŠåãã¢ã€ãã¢ãçºæããããã§ãããéå»25幎ã«ããã£ãŠåãã¢ãããŒãã䜿çšããŠä»ã®å€ãã®ããã°ã©ã ãäœæãããŠããããšã«æ³šæããŠãã ããã
ææ¡ãããäžèŽãããããã§ã¹ç€ã®ãã£ãŒã«ãã«é¢é£ä»ããŸãã å€ã1ã®ãããã¯ããã§ã¹ç€äžã®é§ã®ååšã®å åãšããŠæ©èœããããã0ã¯ãã®äžåšã瀺ããŸããã ãããã£ãŠãçœãããŒã³ãå ãããã£ãŒã«ãã«å¯Ÿå¿ããwhite_pawnãããããŒãã§ã¯ãå€ã1ã®æ倧8ãããããããŸãïŒãã®èšäºã§ã¯ããã£ãŒã«ãã«ã¯0ãã63ãŸã§ã®çªå·ãä»ããããäœçœ®0ã¯ãã£ãŒã«ãA1ã«ã7ã¯ãã£ãŒã«ãH1ã«å¯Ÿå¿ã56 64ãããæŽæ°ã®äœçœ®0ã«ãããããã¯ãæäžäœãããããšåŒã°ããäœçœ®63ã®ãããã¯ãæäžäœãããããšåŒã°ããŸãïŒïŒæäžäœããããMSBæäžäœããããLSB-ãããã®ç¿»èš³ãïŒ
ãããã®12ã®64ãããã¯ãŒãã§ããŒãã«äœçœ®æ å ±ãä¿åããããšã«å ããŠãã¹ã¬ãŒããšã¢ããã³ã¯ãç°ãªãçš®é¡ã®æ å ±ã察象ãšãããããããŒãã®2ã€ã®è¿œå ã»ãããçæãããã®åŸæŽæ°ããæ¹æ³ã説æããŸããã attack_from [64]-åãã£ãŒã«ãã®å€ã1ã§ãããããããŒãã®é åãç¹å®ã®ãã£ãŒã«ãã«ç«ã£ãŠãããã£ã®ã¥ã¢ã«ãã£ãŠæ»æãããå¯èœæ§ããããŸãã ããšãã°ãattacks_from [E4]ã¯ããã£ãŒã«ãE4ã«ç«ã£ãŠãã人ç©ã«ãã£ãŠçŽæ¥æ»æããããã£ãŒã«ããæäŸããŸãã ããã«ãattacks_to [64]é åã«ã¯ããã®ãã£ãŒã«ããæ»æãããã£ã®ã¥ã¢ãå ãããã¹ãŠã®ãã£ãŒã«ãã®ããã1ãæã€ãããããŒããå«ãŸããŠããŸãã ããšãã°ãattacks_to [E4]ã¯ãããŒãäžã®ãã¹ãŠã®ãã£ãŒã«ãã«ããã1ãå«ããããããŒãã§ãå°è±¡çãªãã£ãŒã«ãE4ã®æ°åããããŸãã
ãã®2ã»ããã®ãããããŒãã¯ãã®èšäºã®äž»é¡ã§ãããå®è¡é床ãå€§å¹ ã«äœäžãããããšãªãattack_from []ãããããŒããåçã«èšç®ããæ°ããéåžžã«é«éãªæ¹æ³ã説æããŸããããã¯SlateãšAtkinã説æããæŽæ°æ¹æ³ã®å Žåã§ãã ïŒSlate / Atkinã¯ã·ãŒã±ã³ã·ã£ã«ã¢ããããŒãã䜿çšããããšã«æ³šæããŠãã ããã以äžã«èª¬æããæé ã¯ãããªã³ã¶ãã©ã€ãã§é·è·é¢ãã£ã®ã¥ã¢ã®æ»æãèšç®ããã«ã¯é ãããããã§ãããããããŒããåäœããããšåæã«é«ãèšç®ã³ã¹ããåé¿ããããã«ãã·ãŒã±ã³ã·ã£ã«ã¢ããããŒãã䜿çšããŸããïŒ
ãã§ã¹ããã°ã©ã ã§éåžžã«åœ¹ç«ã€ãããããŒãã«ã¯ãä»ã«ã䟿å©ãªããããã£ããããŸãã ãããã®ããããã£ã®1ã€ã¯ããããã䞊åãæäœãšåŒã°ãããã®ã§ãã ããšãã°ãåŸæ¥ã®ãã§ã¹ããã°ã©ã ã§ã¯ãããŒã³ãE4ãã£ãŒã«ãã«ãããããããã§ãã¯ãã€ã³ãã§ãããã©ããã確èªããå ŽåãD5ãE5ãF5ãD6ãE6ãF6ãD7ãE7ãF7ãã£ãŒã«ãããã§ãã¯ããå¿ èŠããããŸãæµã®é§ããªãããšã確èªããŠãã ããã ããã«ã¯ã9ã€ã®æ¯èŒæäœãå¿ èŠã§ãã ãããããŒãã䜿çšããŠãããŒã³ãç«ã€ããšãã§ããåãã£ãŒã«ãã®ãã¹ã¯ã®é åãäºåã«èšç®ããis_passed_white [E4]ãã¹ã¯ãååŸããŠããããããŒã³ãšé»ããŒã³ã®ãããåäœã®ãANDãæŒç®ãå®è¡ããã ãã§ãã ãã¹ã¯ãæ£ããèšç®ããŠãäžéšã®9ã€ã®ãã£ãŒã«ãã®ããããã«åäœãããå Žåã1ã€ã®ANDæŒç®ã«ãããé»ã®ããŒã³ãååšããªãããéã«ãããã®ååšãå€å®ãããE4ã®çœã®ããŒã³ãééã§ããªããªããŸãã å®éã9ã€ã®ç°ãªããã§ãã¯ã䞊è¡ããŠå®è¡ãã1ã€ã®ANDæŒç®ã§9ã€ã®è³ªåã«åæã«åçããŸããã
ä»ã®å©ç¹ããããŸããããã®èšäºã®ãããã¯ã¯å転å¯èœãªãããããŒãã§ãããå¿ èŠã«å¿ããŠãé£ç¶æŽæ°ã«ããå¶éãªãã§è€éãª/é ããµã€ã¯ã«ãªãã§ãattacks_from [64]ããã³attacks_to [64]é åããããŒã¿ãååŸããæ¹æ³ã§ãã ã
2.éåžžã®ãããããŒãã䜿çšããAttacks_fromé å[64]ã®èšç®
å転ãããããŒãã®æ¹æ³ã«é²ãåã«ãattacks_from []ã®èšç®ã®è€éãã«æ³šæããå¿ èŠããããŸãã çè·é¢ã®æ°åã®å Žåãããã¯ãã¡ããéåžžã«ç°¡åã§ãã ããšãã°ãknight_attacks [64]é åãäºåã«æºåããŠã銬ãF6ãã£ãŒã«ãã«ããå Žåãknight_attacks [F6]ã¯ã銬ãF6ãã£ãŒã«ãããæ»æã§ãããã¹ãŠã®ãã£ãŒã«ãã«ããã1ãå«ããããããŒãã«ãªãããã«ããããšãã§ããŸãã銬ã«æ»æãããå Žåããã§ã¹ç€äžã®é§ã®é 眮ã«äŸåããªãã§ãã ããïŒã åãèãæ¹ããã³ã°ãšããŒã³ã«ãæ©èœããŸãïŒããŒã³ã¯æãã«ãããããããã1ã€ãŸãã¯2ã€ã®ãã£ãŒã«ããåæ¹ã«ç§»åããããšãªããããããªå€æŽãå ããŸãïŒã
ãã ããé·è·é¢ãã£ã®ã¥ã¢ã®å Žåãé·è·é¢ãã£ã®ã¥ã¢ã¯åãã®æ¹åã§ã®ã¿æ»æãããã®æ¹åã§æåã«ééããæ°åã ããæ»æãããããã¢ã¬ã€ãžã®åçŽãªã¢ããŒã«ïŒäžèšã®ããã«ïŒã¯æ©èœããŸããã ã§ã¯ããããã©ã®ããã«èšç®ããã®ã§ããããïŒ
æåã«ãå é ãããæ£æ¹åœ¢ãšåŒã°ãããããããŒããå¿ èŠã§ããããã¯ãä»»æã®è²ã®åœ¢ç¶ããããã¹ãŠã®ãã£ãŒã«ãã«åäœã衚瀺ããããããããŒãã«ãããŸããïŒããšãã°ããããåäœã®ãORãïŒORïŒå³ã®ã¿ã€ãããšã«12åã®ãããããŒããã¹ãŠã®éã§ãå®éã«ã¯ãã®ãããª2ã€ã®ãããããŒããæ ŒçŽããŸãïŒ1ã€ã¯é»çšããã1ã€ã¯çœçš-å¿ èŠã«å¿ããŠãããã®éã§ORæŒç®ã䜿çšããå é ãããæ£æ¹åœ¢ã®ãããããŒããååŸããŸãïŒã
å³1ã¯ãå æãã£ãŒã«ãã«ãXãã®ããŒã¯ãä»ããããéå æãã£ãŒã«ãã«ã-ãã®ããŒã¯ãä»ãããããã§ãã«ãŒããŒãã®äœçœ®ã®äŸã瀺ããŠããŸãã
é·è·é¢ã®ãã£ã®ã¥ã¢ã¯ãã©ããªçš®é¡ã®ãã£ã®ã¥ã¢ã«åºäŒã£ãŠãåæ¢ããããããã£ãŒã«ãã«äœããããã¯åé¡ã§ã¯ãããŸããã 象ããã£ãŒã«ãF5ã«ç«ã€ãšïŒå³2ã§Bã§ããŒã¯ãããŠããïŒã次ã®ãã£ãŒã«ãã»ãããçŽæ¥æ»æããŠããããšãããããŸãïŒ{B1ãC2ãD3ãE4ãG6ãH3ãG4ãE6ãD7}ã æ»æãããããŒããèšç®ããåŸïŒããããã®äœçœ®ããã®èš±å®¹ããã象ã®åãã䜿çšããå ŽåïŒãèªåã®é§ãæã€ãã¹ãŠã®åããé€å€ããå¿ èŠããããŸãã åè¿°ã®white_occupiedãããããŒãã䜿çšããŠãè£æ°æŒç®ïŒãããããšã®åŠå®ïŒãé©çšãã次ã«æ»æãããããŒããšANDæŒç®ãé©çšã§ããŸããããã«ããã象ã®æ»æãããããŒãå ã®èªåã®ããŒã¹ã«å¯Ÿããæ»æã«å¯Ÿå¿ãããããããªã»ãããããŸãããããã¯ç¡å¹ãªåãã§ãã
ãããŸã§ã®ãšããè¯ãã ããããããŒã¹ã移åã§ãã4æ¬ïŒãŸãã¯ã¯ã€ãŒã³ã®å Žåã¯8æ¬ïŒã®å ç·ããã¹ãŠåæããã«ãæ»æãããããããã©ã®ããã«å€æããã®ã§ããããïŒ äžè¬ã«ãããã¯ããã»ã©é£ãããããŸããããåæ¹åã§ã«ãŒãã®åå¥ã®å埩ãå¿ èŠã«ãªããããããŸãå¹æçã§ã¯ãããŸããã
æåã«ããã£ã®ã¥ã¢ã移åã§ãã8ã€ã®æ¹åããããã«ãã¹ã¯ã®ã»ãããäœæããŸãã ãã©ã¹1 [64]ããã©ã¹7 [64]ããã©ã¹8 [64]ããã©ã¹9 [64]ããã€ãã¹1 [64]ããã€ãã¹7 [64]ããã€ãã¹8 [64]ããã€ãã¹9 [64]ãšåŒã³ãŸãã ãããã®ãããããŒãã«ã¯ãç¹å®ã®æ¹åã§SQãã£ãŒã«ããã象ãæ»æã§ãããã£ãŒã«ãã®ããã1ãå«ãŸããŠããŸãã ãã®äŸã§ã¯ãF5ã®åžæãplus7æ¹åïŒãããã®ãã£ãŒã«ãã¯F5-E6-D7-C8ã§ãïŒã§ãplus7 [F5]ã¯å³3ã®ããã«ãªããŸãã
ããã«ããã象ãšããŒãã®ç«¯ã®éã«é害ç©ããªããã°ã象ã+7æ¹åã«æ»æã§ãããã¹ãŠã®ãã£ãŒã«ããåŸãããŸãã ããããæã ã¯ããããååšããå¯èœæ§ãããããšãç¥ã£ãŠããããããããªããç§ãã¡ã¯ãã®æ¹åã®åŠšå®³äººç©ãèŠã€ããªããã°ãªããŸããã ãããè¡ãããã«ãäžèšã®ãããããŒããååŸãããããšå é ãããæ£æ¹åœ¢ã®ãããããŒãã®éã§ANDãå®è¡ããŸãã 象ããã®æ¹åã§ãããã¯ãããŠããå Žåãããã1ãåãã£ãŒã«ããè¡šãã象ã®C8ãžã®æãã®åãããããã¯ããå³ããã空ã§ãªããããããŒããååŸããŸãã æåã®ãããã¯å³ã®ã¿ãå¿ èŠãªãããFirstOneïŒïŒé¢æ°ã䜿çšããŸããããã¯ãå€1ã®æåã®ãããã®ã€ã³ããã¯ã¹ãè¿ããŸããããšãã°ã象ãC8ããã³D7ã§ãããã¯ãããå ŽåãFirstOneïŒïŒã¯ãã£ãŒã«ãçªå·D7ïŒ51ïŒãè¿ãå¿ èŠããããŸãã
ããã§ããã®å¯Ÿè§ç·ã«æ²¿ã£ãŠæ»æããããã£ãŒã«ãã®ãªã¹ããšãé·è·é¢ãã£ã®ã¥ã¢ããããã¯ãããŠãããã£ãŒã«ããã§ããŸããã ç§ãã¡ãããã¹ãããšã¯ãããããã³ã°æ°åã®åŸã«æ»æããããã£ãŒã«ããåé€ããããšã ãã§ãã ãããŠãããã¯æãç°¡åãªéšåã§ãã ãããè¡ãæ¹æ³ã次ã®ã³ãŒãäŸã§èª¬æããŸãã
diag_attacks = plus7 [F5]; ãããã«ãŒ= diag_attacksïŒå é ãããæ£æ¹åœ¢; blocking_square = FirstOneïŒãããã«ãŒïŒ; diag_attacks ^ = plus7 [blocking_square];
ãããã1ã€ã®ããŒã ã«å¯ŸããŠè¡ãå¿ èŠããããã¹ãŠã§ãã ã³ãŒãããããããããããããdiag_attacksã¯äžèšã®ãããããŒãã§ãF5ãã£ãŒã«ãããã®æ»æãã£ãŒã«ãã+7æ¹åã«å«ãŸããŠããŸãã ãããã«ãŒã«ã¯ããã¹ãŠã®ããŒã¹ããã®å¯Ÿè§ç·äžã«ãããããããŒãããããŸãã æåã®ãããã¯å³ãèŠã€ããplus7 [blocking_square]ãšdiag_attacksã®éã®æä»çãORããäœæããŸããããã«ãããããã«ç¶ããã¹ãŠã®æ»æãã£ãŒã«ããå®éã«é®æãããŸãã ïŒãããç解ããŠã¿ãŸããããF5ã®åžæãE6ã§ãããã¯ãããŠããå Žåããã®å Žåã®plus7 [E6]ã¯æ¬¡ã®ããã«ãªããŸãããŠãããã®ãããã¯D7ãšC8ã®ã¿ã§ããD7/ C8ãããã¯äž¡æ¹ã®ãããããŒãã§ãŒãã§ã¯ãªããããæä»ç㪠"ãŸãã¯ããããããŒãéã§ããããã®ïŒããã³ãããã®ãããã®ã¿ïŒããªã»ãããããŸããïŒ
æåŸã®ãããã¯å³ãèŠã€ããå¿ èŠãããããããã€ãã¹æ¹åã®å Žåã¯FirstOneïŒïŒã䜿çšããªããšããéãã ãã§ã4ã€ã®æ¹åãã¹ãŠã«ã€ããŠãããç¹°ãè¿ããŸãã ããã®ä»£ããã«ãLastOneïŒïŒã«åãæ¿ããŸãã ããã§ã4ã€ã®æ¹åãã¹ãŠã§è±¡ã®æ»æãã«ãŠã³ãããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
diag_attacks = plus7 [F5]; ãããã«ãŒ= diag_attacksïŒå é ãããæ£æ¹åœ¢; blocking_square = FirstOneïŒãããã«ãŒïŒ; bishop_attacks = diag_attacks ^ plus7 [blocking_square]; diag_attacks = plus9 [F5]; ãããã«ãŒ= diag_attacksïŒå é ãããæ£æ¹åœ¢; blocking_square = FirstOneïŒãããã«ãŒïŒ; bishop_attacks | = diag_attacks ^ plus9 [blocking_square]; diag_attacks = minus7 [F5]; ãããã«ãŒ= diag_attacksïŒå é ãããæ£æ¹åœ¢; blocking_square = LastOneïŒãããã«ãŒïŒ; bishop_attacks | = diag_attacks ^ minus7 [blocking_square]; diag_attacks = minus9 [F5]; ãããã«ãŒ= diag_attacksïŒå é ãããæ£æ¹åœ¢; blocking_square = LastOneïŒãããã«ãŒïŒ; bishop_attacks | = diag_attacks ^ minus9 [blocking_square];
ããã¯ãANDããã³ORã䜿çšããå€æ°ã®æäœãšãã¹ãã³ã°ã®å¿ èŠæ§ã«å ããŠãFirstOneïŒïŒ/ LastOneïŒïŒé¢æ°ã䜿çšããŠããããã³ã°ãã£ãŒã«ããæ€åºããããšã«ãªããŸãã ããã¯éåžžã«é«äŸ¡ã§ãããããŒã«æŒç®åã§ã¯ã»ãšãã©ã®äœæ¥ã䞊è¡ããŠè¡ããããããããã§ãæ£åœåã§ããŸãã ãã ããFirstOneïŒïŒ/ LastOneïŒïŒã®åŒã³åºããåé€ããããè¯ãæ¹æ³ãããããã®ã¡ãœããã®ããã«2段éã§ã¯ãªãã1段éã§å¯Ÿè§ç·/æ°Žå¹³/åçŽå šäœãåŠçããŸãã
FirstOneïŒïŒ/ LastOneïŒïŒé¢æ°ã¯ãCã§ããã·ãŒãžã£ãšããŠå®è¡ãããšéåžžã«é«äŸ¡ã«ãªãããšã«æ³šæããå¿ èŠããããŸããæåãŸãã¯æåŸã®ããããèŠã€ããããšã¯ãäžèšã®æ»æã®èšç®ã«å€ãã®æéãå¿ èŠãšããéèŠãªã¿ã¹ã¯ã ããã§ãã 幞ããªããšã«ãææ°ã®ãã€ã¯ãããã»ããµã«ã¯ãããã®å€ãèšç®ããããã®ããŒããŠã§ã¢åœä»€ããããŸãïŒIntelã¯X86ã¢ãŒããã¯ãã£ã«BSF / BSR [ãããã¹ãã£ã³ãã©ã¯ãŒãããããã¹ãã£ã³ãªããŒã¹]åœä»€ãåããŠããŸãïŒã ä»ã®ã¿ã€ãã®ã¢ãŒããã¯ãã£ãåæ§ã®æ瀺ãæäŸããŸãã
3.å転å¯èœãªãããããŒã
1994幎9æã«ãããããŒãã䜿çšããCraftyããŒãžã§ã³ãç»å ŽããåŸãç§ã¯UABã§ã»ãããŒãéå§ããŸããïŒCrafty-Robert Hyattã«ãã£ãŠæžããããã§ã¹ããã°ã©ã ãUAB-ããŒãã³ã¬ã ã®ã¢ã©ãã倧åŠ-ãããã®ç¿»èš³ïŒãå¹çãé«ããããã®æ°ããæ¹æ³ã«åãçµã¿ãéçºããŸãã æåã®è°è«ã®1ã€ã¯ãæ°Žå¹³é¢ã«æ²¿ã£ãŠé·è·é¢ã®äººç©ã®åããçæããããšãããã«ç°¡åããšããããšã§ããã
ç¹å®ã®æ°Žå¹³ç·ïŒãã§ã¹ç€ã®ãã£ãŒã«ãã®æ°Žå¹³åïŒã®ãã£ãŒã«ããåãå Žåãé·è·é¢ã®é§ã®åãã¯éåžžã«ç°¡åã«ååŸã§ããŸããããã¯ãå é ãããæ£æ¹åœ¢ã®ãããããŒãã®8ãããã«ãã£ãŠæ°Žå¹³ã決å®ãããããã§ãã ãã®ãããããŒããå³ã«ç§»åããŠããã®äžäœãããã«æ°Žå¹³æ¹åã®8ããããå«ãŸããããã«ãã次ã«æ°å€255ãšANDãå®è¡ãããšããã®æ°Žå¹³æ¹åã®ãã£ãŒã«ãã«å¯Ÿå¿ãã8ããããåŸãããŸãã
ããã念é ã«çœ®ããŠãrank_attacks [64] [256]ãããããŒãã®é åãæ€èšããŠãã ããã ãã®é åãåæåããã«ã¯ãA1ãªã©ã®ãã£ãŒã«ãã䜿çšããŸãã ã©ã®ãã£ãŒã«ããå æãããã©ã®ãã£ãŒã«ããå æãããŠããªããã«å¿ããŠããã®æ°Žå¹³ã«ã¯256ã®ç°ãªãç¶æ ãããªãããšãããããŸãã ã²ãŒã ãéå§ããåã«ããã®æ°Žå¹³ã®åäžãããã®256ã®ãã¹ãŠã®çµã¿åãããèæ ®ããŠãA1ã®ã«ãŒã¯ãã©ã®ãã£ãŒã«ãã«é²ãããšãã§ããããäºåã«èšç®ã§ããå ŽåããããããŒãrank_attacks [A1] [contents]ãåç §ããã ãã§ããã®æ°Žå¹³ã®ãã£ãŒã«ããæ»æããããšãã§ããŸããããã§ãcontentsã¯äžããããæ°Žå¹³ã®ç¶æ ã®8ãããè¡šçŸã§ãã å¿ èŠãªã®ã¯ã64åã®ãã£ãŒã«ãã®ãããããšããããã®ãã£ãŒã«ããé 眮ãããŠããæ°Žå¹³ç·ã®256ã®ç°ãªãç¶æ ãã¹ãŠã«å¯ŸããŠãããããŒãã®ã»ãããèšç®ããããšã§ãïŒãããèããŠã¿ãã°ãæ°Žå¹³ç·ã¯128ç¶æ ããæãŠãŸããããã£ãŒã«ãã®1ã€ã¯ã«ãŒã¯ã§ããããã®åçŽåãç¡èŠããæ¹ãç°¡åã§ãïŒã ããã§ãæ°Žå¹³ã«ã¯8ã€ã®ã¹ããŒã¿ã¹ãããããããŸããã2ã€ã®æ¥µç«¯ãªãããïŒLSBãšMSBïŒã¯ãæ°åããããã©ããã«é¢ä¿ãªãæ»æããããããäœãå€ãããŸããã ãã®çµæãåæ°Žå¹³ã®ããŒãã«ãµã€ãºã75ïŒ åæžããããã«ããããã以éã®èšç®ããåé€ããŸãã ãããã£ãŠãrank_attacksé åã®ãµã€ãºãrank_attacks [64] [64]ã«æžãããŸãã ä»ã®ãã¹ãŠã®åæ§ã®é åã¯ãåãåçŽåã䜿çšããŸãã
ãããŸã§ã®ãšãããrank_attacksé åã§ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããã ãã§ãã«ãŒã¯æ»æã®ååãåŸãããšãã§ããŸãã ãããã象ã®åçŽæ»æãš2ã€ã®å¯Ÿè§ç·ã¯ã©ãã§ããããã ããã§ã¯ããããã¯å é ãããæ£æ¹åœ¢ã®ãããããŒãã§é£æ¥ããŠããªããããçé«ç·ä»¥å€ã«ã¯é©çšã§ããŸããã
ã»ãããŒã§ããã«ã€ããŠè°è«ããŠããéãç¹æ®ãªãã§ã¹ã®æ©åšã䜿çšããå Žåãã¬ãžã¹ã¿ãå²ãåœãŠãŠ64ãããã®å é ãããæ£æ¹åœ¢ã®å€ãæ ŒçŽããããšã«æ°ã¥ããŸããããå é ãããæ£æ¹åœ¢ã«ã¢ã¯ã»ã¹ã§ããä»ã®3ã€ã®ãç䌌ã¬ãžã¹ã¿ãã匷調衚瀺ã§ããŸãããŸããŸãªæ¹æ³ã§ã ããšãã°ãå é ãããæ£æ¹åœ¢ã®å å®¹å šäœã90床å転ããŠãåãåçŽã®ããããé£ç¶ããããã«ããŸãã äºåã«èšç®ãããæ°Žå¹³æ¹åã®æ»æãšåãããã«ãããã䜿çšããŠåçŽæ¹åã®æ»æãèŠã€ããããšãã§ããŸãã ãŸããå é ãããæ£æ¹åœ¢ã®ãããããŒããå·Šå³ã«45床å転ããã2ã€ã®ã¬ãžã¹ã¿ãåºå¥ã§ããããããããã®å転ãããããããŒãã®å¯Ÿè§ç·ããããé£æ¥ããŸãã å³4ã¯ãéåžžã®ãã§ãã«ãŒããŒãäžã®ãã£ãŒã«ãã®çªå·ä»ãæ¹æ³ã瀺ããŠããŸãã
A1ãzero_bitãããïŒMSBïŒã§ãããH8ãå é å¹³æ¹ãããããŒãã®63çªç®ã®ãããïŒLSBïŒã§ããããšãæãåºããŠãã ããã æåã«ãå·Šã«90床å転ããŠåçŽããããé£ç¶ãããŸãïŒ64ãããã®ãããããŒãã§ã¯å·Šäžé ããŒããããã®ãŸãŸã§ãããå³äžé ã«ã¯åžžã«ã·ãªã¢ã«çªå·63ãããããšã«æ³šæããŠãã ããïŒå³5ã
次ã«ãå³6ã«ç€ºãããã«ãå ã®äœçœ®ãå·Šã«45床å転ããŸãã
ãã®å転ãããããããŒãã§ã¯ãããã ãã£ãŒã«ãïŒA1ïŒããã«ãããã«ãªãã次ã®ãã®ãé çªã«ãªããŸãã ãããã£ãŠãããšãã°ãA2ã¯ããã1ã«ãªããB1ã¯ããã2ã«ãªããH8ãããã63ã«ãªããŸã§ç¶ããŸãã
äžèšã®ãããããŒãã§ã¯ãH1ããA8ãŸã§ã®å¯Ÿè§ç·ãšããã«å¹³è¡ãªãã¹ãŠã®å¯Ÿè§ç·äžã®ããããé£æ¥ããŠããããšã«æ³šæããŠãã ããã ããã¯ãæåã®2ã€ã®ãããããŒãã»ã©äŸ¿å©ã§ã¯ãããŸããã é åã®ã€ã³ããã¯ã¹ãšããŠäœ¿çšã§ããããã«ãç¹å®ã®æ°Žå¹³ãŸãã¯åçŽãæ°å€ã®å³ç«¯ã«ã©ãã ãã·ããããå¿ èŠãããããç°¡åã«èšç®ã§ããŸãã ãŸããå¿ èŠãª8ããããæœåºããã«ã¯ãæ°å€255ãšANDãå®è¡ããå¿ èŠãããããšãããã£ãŠããŸããã察è§ç·ã®å Žåãå察è§ç·ã®é·ãã¯ç°ãªããŸããã€ãŸããã·ãããšãã¹ã¯ã®å€ãå€ããŠäœåãªããããåé€ããŸãã ãã®åé¡ã®è§£æ±ºçã«ã€ããŠã¯åŸè¿°ããŸãã
å³7ã®ãããããŒãã®ããã«ãå ã®ãããããŒããå³ã«45床å転ããŠãä»ã®å¯Ÿè§ç·äžã«é£æ¥ããããããäœæããŸãã
ããããã¹ãŠæã£ãã®ã§ããã§ã«èæ ®ãããŠããrank_attacks [64] [64]ã«å ããŠãæ»æã®ããã«ãããããŒãã®é åãããã«3ã€è¿œå ããå¿ èŠãããããšãæããã«ãªããŸãã File_attacks [64] [64]ãdiaga1h8_attacks [64] [64]ãããã³diagh1a8_attacks [64] [64]ãè¿œå ãããå ã®å é ãããæ£æ¹åœ¢ã®ãããããŒãã®å転ãåŠç¿ããå Žåãåãã€ã³ããã¯ã¹ã¹ããŒã ã䜿çšã§ããŸãããŸãŠãŸãã¯ã«ãŒã¯çšã®ããŒãã«ãžã®2åã®åŒã³åºããšã¯ã€ãŒã³çšã®4åã®åŒã³åºãã®æŽæ°æé ã
ãã®åŸãå é ãããæ£æ¹åœ¢ã®ãããããŒããå転ãããæ¹æ³ã«ã€ããŠå€ãã®è°è«ãããåŸãç°¡åãªè§£æ±ºçãèŠã€ãããŸããã å é ãããæ£æ¹åœ¢ã®ãããããŒãã®ã¿ãä¿åããå¿ èŠã«å¿ããŠå転ãããã®ã§ã¯ãªãïŒéå¹çæ§ã®ããã»ãšãã©äžå¯èœãšèããããŸãïŒãå æãã£ãŒã«ãã«4ã€ã®ãããããŒããä¿åã§ããŸãïŒéåžžããã³90床å転ãå·Šã«45床ãå³ã«45床ã MakeMoveïŒïŒã®å³ã移åããæé ã§ãå é ãããæ£æ¹åœ¢ã®ãããããŒããæŽæ°ããåæ§ã®ã³ãŒããèŠã€ããããšãã§ãããããããã¯éåžžã«ç°¡åã§ãã
å æã¹ã¯ãšã¢^ = set_mask [from] | set_mask [to];
ããã¯ãopposed_squaresã®éå§ãã£ãŒã«ããfromãã®ãããã1ã«èšå®ããå¿ èŠãããããšãããã£ãŠããããã§ãïŒããã§ãªãå Žåã移åããå³åœ¢ã¯ãããŸããïŒã ïŒ; ãŸããoccupiced_squaresãããããŒãã®æåŸã®ãtoããã£ãŒã«ãã®ãããã®å€ã¯ãŒãã§ãªããã°ãªããŸããïŒããã§ãªããã°ãã€ã¯ã«ãªããŸãïŒã ãããã£ãŠãæä»çãªãORãã䜿çšããŠãéå§ãã£ãŒã«ããããããªã»ãããããçµäºãã£ãŒã«ãããããèšå®ãããŸãã
set_mask [64]ãããããŒãé åã®ãã¹ãŠã®èŠçŽ ã«ã¯ã察å¿ããäœçœ®ã«1ãããã®ã¿ãèšå®ãããŠããŸãã ããšãã°ãset_mask [0]ã«ã¯å·Šç«¯ã®ãããã»ããïŒãŒããããïŒããããset_mask [63]ã«ã¯æäžäœãããã»ããïŒ63çªç®ã®ãããïŒããããŸãã å転å¯èœãªãããããŒãã䜿çšããããã«ãset_mask_rl90 [64]ãset_mask_rr45 [64]ãset_mask_rl45 [64]ãšãã3ã€ã®æ°ãããã¹ã¯ã»ãããäœæããŸããã ãããã¯ããããããã£ãŒã«ãçªå·ãã€ã³ããã¯ã¹ãšããŠäœ¿çšãããããããããè¿ããŸãããããããŒãã§ã¯ã察å¿ããããããå é äžã®å転å¯èœãªãããããŒãã«èšå®ãããŠããŸãã ããšãã°ãset_mask_rl90 [0]ã¯å®éã«7çªç®ã®ããããèšå®ããŸããããã¯ãrotated_leftãããããŒãã§ç»åãèŠããšãããã0ã7çªç®ã«ãªãããã§ãã
ãããããã¹ãŠãæ©èœãããããã«å¿ èŠãªãœãªã¥ãŒã·ã§ã³ã§ããã å é ãããæ£æ¹åœ¢ã®ãããããŒããå転ããã代ããã«ã4ã€ã®å é ãããæ£æ¹åœ¢ã®ãããããŒããåæã«ä¿åãããããã®ã¿ã€ãã®ãã£ã®ã¥ã¢ã®æ»æãåããå¿ èŠããããšãã¯ãã€ã§ããã·ã§ãã/ã«ãŒã¯çšã«2ã€ããŸãã¯å¥³ççšã«4ã€äœ¿çšã§ããŸãã
象ã®å Žåã䜿çšã§ããæé©åã1ã€ãããŸãããã¡ã¢ãªã«æ¯ã¹ãŠé«äŸ¡ã§ãã ã«ãŒã¯ã®å Žåã察å¿ããæ°Žå¹³ãŸãã¯åçŽãæ°å€ã®å³ç«¯ã«ç§»åãã255ãšANDãå®è¡ããŠãã®æ°Žå¹³ãŸãã¯åçŽã®å 容ãååŸããããšãæãåºããŠãã ããã ããã¯ãåæ°Žå¹³ãŸãã¯åçŽã«8ããããå«ãŸããŠããããæ©èœããŸããã ãããã察è§ç·ã®å Žåãããããã®é·ãã¯é£ã®ãã®ãšã¯ç°ãªããŸãã
ãã®ã¢ã«ãŽãªãºã ãåçŽåããããã«ã察è§ç·ã®å Žåã«AND 255ãå®è¡ããŸããããã«ãããæããã«ãç®çã®å¯Ÿè§ç·ãåŸãããŸãããé£æ¥ãã察è§ç·ïŒå¯Ÿè§ç·ïŒããã®äœåãªããããããã€ããããŸãã 察象ã®å¯Ÿè§ç·ã«3ãããïŒåèš8ã€ã®äžæã®ç¶æ ïŒãããªãå Žåããããã®8ã€ã®ç¶æ ã®ããããã«32ãããã®äœåãªããããçµåãããŸãã ã€ãŸããå¿ èŠãª3ãããã®ç¶æ ãããã32åç¹°ãè¿ãããŸãã ãããã£ãŠãè¿œå ã®5ãããã«äœãå«ãŸããŠãããã¯é¢ä¿ãããŸãããã3ãããã®å¯Ÿè§ç·ã«å¯ŸããŠæ£ããæ»æãããããŒããååŸã§ããŸãã
4.å転å¯èœãªãããããŒãã䜿çšããattack_from [64]ã®èšç®
æ»æãèšç®ããããã«ã4ã€ã®ç°ãªãé åã䜿çšããŸãã1ã€ã¯æ°Žå¹³æ»æã1ã€ã¯åçŽæ»æããã1ã€ã¯ãã£ãŒã«ããééãã2ã€ã®å¯Ÿè§ç·ã§ãã ãããã®ã¢ã¬ã€ã«ã¯ãrank_attacks [64] [64]ãfile_attacks [64] [64]ãdiaga1h8_attacks [64] [64]ãdiagh1a8_attacks [64] [64]ãšããååãä»ããŸããã
ãããã®é åãåæåããããã«ïŒããã¯ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«è¡ããããã以éã¯é åã¯å€æŽãããŸããïŒãåé¡ã®æ¹åïŒããšãã°ã女çïŒã«ç§»åã§ãããã£ãŒã«ãã«é·è·é¢ã®æ°åããããšåçŽã«ä»®å®ããŸããã 次ã«ãåãã£ãŒã«ãã«rank_attacks [square] [rank_contents]ãå°å ¥ããŸããããã®æ°Žå¹³ã®ãã£ãŒã«ããrank_contentsçªå·ã®8ãããã«åŸã£ãŠå æãããŠããå Žåãæ£æ¹åœ¢ã®æ£æ¹åœ¢ã«ç«ã€ã«ãŒã¯/ã¯ã€ãŒã³ãã©ã®æ°Žå¹³ç·ã移åã§ãããã瀺ããããããŒããã ããšãã°ã以åã«æ€èšãããå é ãããæ£æ¹åœ¢ã®ãããããŒããåãäžããŸãããåã®äŸã®ããã«F5ãã£ãŒã«ãã®åžæã®ä»£ããã«ãããã«ã«ãŒã¯ã眮ããŸãïŒå³8ïŒã rank_attacks [37] [100]ãåæåããããšããŠãããšä»®å®ããŸãïŒ37ã¯ãã£ãŒã«ãF5ã§ã100ã¯ãã®æ°Žå¹³æ¹åã®å æãã£ãŒã«ã-01100100ã«å¯Ÿå¿ããŸãïŒã å³9ã«ç€ºãããã«ããã®rank_attacksèŠçŽ ãåæåããŸããããã¯ãäžèšã®ããã«ãããŒã¹ãF5ã«ãããæ°Žå¹³ã3ã€ã®ããŒã¹ã§å ããããŠããå Žåãã«ãŒã¯/ã¯ã€ãŒã³ã5çªç®ã®æ°Žå¹³ã§æ»æã§ãããã£ãŒã«ãã«å®å šã«å¯Ÿå¿ããŸãã
ãŸããæªããªãã ãããè¡ãããšã«ãããæ°Žå¹³ã«æ²¿ã£ãŠã«ãŒã¯æ»æããã°ããååŸã§ããŸãã ããããæ°Žå¹³æ¹åã§ã¯ãªãåçŽæ¹åã«æ»æãèšç®ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãå é ãããrl90ãããããŒãã䜿çšããŸããããã¯ãåã®å é ãããæ£æ¹åœ¢ã®æ£ç¢ºãªã³ããŒã§ãããå³10ã«ç€ºãããã«90床å転ãããŠããŸãã
3çªç®ã®ãæ°Žå¹³ããååŸãããšãå®éã«ã¯ãåçŽFã§ã®éçšã«é¢ããæ å ±ãååŸããŸãïŒãããããæ°Žå¹³ãã3çªç®-ãããã®ç¿»èš³ãæå³ããŸãïŒã 以åã«èšç®ãããæ»æãããããŒããåã³äœ¿çšãããŸãããä»åã¯attacks_file [37] [251]ïŒããäžåºŠã37ã¯ãã£ãŒã«ãF5ãããã³ãã®åçŽãã©ãŒã 11111011ã®å æãã£ãŒã«ããæå³ããŸãïŒãå³ã«ç€ºãããã«æ±ºå®ããå€11ã
ããã§ãæ°Žå¹³æ»æãšåçŽæ»æã®äž¡æ¹ã®å€ãåãããããã®éã§ORãè¡ããšããã£ãŒã«ãF5ã«ç«ã£ãŠããã«ãŒã¯ã®æ»æãã£ãŒã«ãã®å®å šãªã»ãããåŸãããŸãã occupied_squares, , OR / . , . :
BITBOARD attacks=0; if (BishopMover(piece)) { get diaga1 status (shift/AND); /* 6 bits */ attacks|=diaga1h8_attacks[square][status]; get diagh1 status (shift/AND); /* 6 bits */ attacks|=diagh1a8_attacks[square][status]; } if (RookMover(piece)) { get rank status (shift/AND); /* 6 bits */ attacks|=rank_attacks[square][status]; get file status (shift/AND); /* 6 bits */ attacks|=file_attacks[square][status]; }
, , . BishopMover() RookMover() «», , ( ), ( ). Crafty , P=1, N=2, K=3, B=5, R=6 Q=7. piece_type&4, , . , piece_type&1 , , piece_type&2 , /.
5. attacks_to[64]
attacks_to[] , , . , attacks_to[28] (28 = E4) , 12, , E4 E8 F6, E1 D3 (E4 T, «target»).
«T» â , 0 . X ( 1) , E4. , E4, AND occupied_squares . 1 , , E4. E4 , AND occupied_squares .
: () () ? (, , , , ), E4, AND / , 1 /, , . /. , AND / . , , OR , , E4.
, , ( ) , (, , , ), .
6.
, , . «/» , , . «» , FirstOne() , «», . . , : (, Crafty 21 . 6 «FROM» (), 6 â «TO» (), 3 â MOVING_PIECE ( ), 3 â PROMOTE_TO, .)
piecebd=WhiteQueens; while (piecebd) { from=LastOne(piecebd); moves=AttacksQueen(from); temp=from+(queen<<12); while (moves) { to=LastOne(moves); move_list[i++]=temp+to<<6; Clear(to,moves); } Clear(from,piecebd); }
, , , , , â . , AND , , , â , . , , , , , ; , , , . , . , .
piecebd=WhiteQueens; while (piecebd) { from=LastOne(piecebd); moves=AttacksQueen(from) & BlackPieces; temp=from+(queen<<12); while (moves) { to=LastOne(moves); move_list[i++]=temp+to<<6; Clear(to,moves); } Clear(from,piecebd); }
, , . , «». , , occupied_squares , ( ).
, attacks_to[]. , (attacks_to[sq]), / . â « ?», , . (/, /, , ) AND ( , , ), , , «», «, ».
, . , , attacks_to[sq], , . , ; AND attacks_to , . AND , , . attacks_to, , AND attacks_to , . , attacks_to .
, , ? . , «» attacks_to, (, , , , , «»). AND, , , . , (/ , / /), OR attacks_to, , . ( plusN[]/minusN[], , , .)
, , , . , . , . . , , (, ), , , . , attacks_to , .
7.çµè«
, « ». , 64 , , . , CPU 64- , , , 64- . 64- , .
64- (Alpha, HP, MIPS â ) 64- , Intel Merced, , . , (AND, OR, XOR, ) 32- â 64- . 64- , . , , .
, ( ), , ( AND , ), . «Chess 4.0» , , , , Crafty ( . , ), . , , Crafty, , «Chess 4.0», « », . « , ?». . , « » (« , » â . .) , ( ) , , «» , .
:
: http://www.cis.uab.edu/info/faculty/hyatt/bitmaps.html
翻蚳è ãã
, . , , . , , , .
:
www.frayn.net/beowulf/theory.html#bitboards
www.craftychess.com
«bitboard», «», , « » .
«bitmap» «bitboard» , « » « » . «».
, : AND, OR . ., .