private static int toHashCode(ChessDrawType drawType, ChessColor drawingSide, ChessPieceType drawingPieceType, ChessPieceType?takenPieceType, ChessPieceType?promotionPieceType, ChessPosition oldPosition, ChessPosition newPosition, bool isFirstMove) { // TODO: try to remove if/else branchings to make this more efficient // shift the bits to the right position (preparation for bitwise OR) int isFirstMoveBits = (isFirstMove ? 1 : 0) << IS_FIRST_MOVE_TRAILING_BITS; int drawTypeBits = ((int)drawType) << DRAW_TYPE_TRAILING_BITS; int drawingSideBits = ((int)drawingSide) << DRAWING_SIDE_TRAILING_BITS; int drawingPieceTypeBits = ((int)drawingPieceType) << DRAWING_PIECE_TYPE_TRAILING_BITS; int takenPieceTypeBits = ((takenPieceType != null) ? (int)takenPieceType.Value : CHESS_PIECE_TYPE_NULL) << TAKEN_PIECE_TYPE_TRAILING_BITS; int promotionPieceTypeBits = ((promotionPieceType != null) ? (int)promotionPieceType.Value : CHESS_PIECE_TYPE_NULL) << PROMOTION_PIECE_TYPE_TRAILING_BITS; int oldPositionBits = oldPosition.GetHashCode() << OLD_POSITION_TRAILING_BITS; int newPositionBits = newPosition.GetHashCode(); // fuse the shifted bits to the hash code (by bitwise OR) int hashCode = (isFirstMoveBits | drawTypeBits | drawingSideBits | drawingPieceTypeBits | takenPieceTypeBits | promotionPieceTypeBits | oldPositionBits | newPositionBits); return(hashCode); }
public ChessPieceAtPos(ChessPosition position, ChessPiece piece) { _hashCode = (short)((position.GetHashCode() << 5) | piece.GetHashCode()); }