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)
关键修复点
类型检查问题解决
- 用
isinstance替代type():符合Python面向对象设计,支持子类扩展,同时避免类型检查器报错 - 类型注解结合
from __future__ import annotations:解决类内部引用自身的类型注解问题 - 添加
else分支返回NotImplemented:避免未定义变量报错,同时让Python自动尝试反向运算
- 用
双向运算支持
- 实现
__rand__/__ror__/__rxor__方法:处理int & BitBoard、int | BitBoard这类左侧为int的运算场景,原生int无法识别BitBoard对象,需通过反向方法完成运算
- 实现
修复原方法逻辑错误
- 修正
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
相关产品推荐
相关产品推荐

