public BFSNode moveUpNode(final boolean[] tilesInSubset) {
		final int posOfSpace = posOfSpace();
		if (posOfSpace < dimension) {
			return null;
		}
		final BFSNode copy = new BFSNode(this);
		// Swap tile with space.
		final int posTimes4 = posOfSpace << 2, posMinusDimTimes4 = (posOfSpace - dimension) << 2;
		final long space = (copy.boardConfig >> posTimes4) & 0xF, tile = (copy.boardConfig >> posMinusDimTimes4) & 0xF;
		final long zeroBitTile = (long) 0xF << posMinusDimTimes4;
		copy.boardConfig = copy.boardConfig & ~zeroBitTile | (tile << posTimes4)
				| (space << posMinusDimTimes4);
		copy.direction = 'U';
		if (this.storePath) {
			copy.path.append('U');
		}
		if (tilesInSubset == null || tilesInSubset[(int) tile]) {
			++copy.cost;
		}
		return copy;
	}