You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python国际象棋BitBoard类重载&运算符支持双类型位与操作

解决BitBoard类与int/BitBoard对象的位运算兼容问题

核心修正方案

针对类型检查报错和运算兼容问题,以下是纯Python实现方案,无需外部模块,同时解决类型检查与双向运算支持:

from __future__ import annotations

FULL_MASK = 0xFFFFFFFFFFFFFFFF

class BitBoard:
    def __init__(self, board: int) -> None:
        self.__board: int = board
    
    @property
    def board(self) -> int:
        return self.__board & FULL_MASK
    
    @board.setter
    def board(self, value: int) -> None:
        self.__board = value & FULL_MASK
    
    def set_bit(self, square: int) -> None:
        self.__board |= (1 << square) & FULL_MASK
    
    def get_bit(self, square: int) -> bool:
        # 修正原方法逻辑错误:返回指定位置的位状态而非修改自身
        return (self.__board & (1 << square)) != 0
    
    def pop_bit(self, square: int) -> None:
        self.__board &= ~(1 << square) & FULL_MASK
    
    # 修正后的AND运算
    def __and__(self, value: int | BitBoard) -> BitBoard:
        if isinstance(value, int):
            return BitBoard((self.__board & value) & FULL_MASK)
        elif isinstance(value, BitBoard):
            return BitBoard((self.__board & value.board) & FULL_MASK)
        else:
            return NotImplemented
    
    # 处理int在左侧的AND运算
    def __rand__(self, value: int) -> BitBoard:
        return self & value
    
    # 修正后的OR运算
    def __or__(self, value: int | BitBoard) -> BitBoard:
        if isinstance(value, int):
            return BitBoard((self.__board | value) & FULL_MASK)
        elif isinstance(value, BitBoard):
            return BitBoard((self.__board | value.board) & FULL_MASK)
        else:
            return NotImplemented
    
    # 处理int在左侧的OR运算
    def __ror__(self, value: int) -> BitBoard:
        return self | value
    
    # 修正后的XOR运算
    def __xor__(self, value: int | BitBoard) -> BitBoard:
        if isinstance(value, int):
            return BitBoard((self.__board ^ value) & FULL_MASK)
        elif isinstance(value, BitBoard):
            return BitBoard((self.__board ^ value.board) & FULL_MASK)
        else:
            return NotImplemented
    
    # 处理int在左侧的XOR运算
    def __rxor__(self, value: int) -> BitBoard:
        return self ^ value
    
    def __inv__(self) -> BitBoard:
        return BitBoard(~self.__board & FULL_MASK)
    
    def __lshift__(self, value: int) -> BitBoard:
        return BitBoard((self.__board << value) & FULL_MASK)
    
    def __rshift__(self, value: int) -> BitBoard:
        return BitBoard((self.__board >> value) & FULL_MASK)

关键修复点

  1. 类型检查问题解决

    • 用isinstance替代type():符合Python面向对象设计,支持子类扩展,同时避免类型检查器报错
    • 类型注解结合from __future__ import annotations:解决类内部引用自身的类型注解问题
    • 添加else分支返回NotImplemented:避免未定义变量报错,同时让Python自动尝试反向运算
  2. 双向运算支持

    • 实现__rand__/__ror__/__rxor__方法:处理int & BitBoard、int | BitBoard这类左侧为int的运算场景,原生int无法识别BitBoard对象,需通过反向方法完成运算
  3. 修复原方法逻辑错误

    • 修正get_bit方法:原方法错误修改__board值,正确逻辑应为返回指定位置的位是否为1的布尔值

使用示例

# 与int运算
bb1 = BitBoard(0xFF)
result1 = bb1 & 0x0F
print(result1.board)  # 输出15

# 与BitBoard对象运算
bb2 = BitBoard(0xF0)
result2 = bb1 & bb2
print(result2.board)  # 输出160

# 左侧为int的运算
result3 = 0x0F & bb1
print(result3.board)  # 输出15

内容的提问来源于stack exchange,提问作者Cheesewaffle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:30:59