问题标签 [bitboard]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
207 浏览

c++ - 迭代位的最快方法

我已经在国际象棋引擎上工作了一段时间,它相当强大(大约 2700 CCRL)并且想知道以下事情:


大多数顶级国际象棋引擎都使用位板。它们基本上只是 64 位数字,代表一些二进制数据,例如一个正方形是否被占用。有许多应用程序可以使用位板,但在许多情况下,我需要遍历所有位并使用已设置位的索引。

我事先定义的一些功能:

使用这两个,我通常像这样迭代位板:

另一种解决方案是:

然而第二个结果却更慢(出于某种原因)。

我的问题是:

  1. 为什么第二种方法较慢?
  2. 有更快的方法吗?特别是在通过调整一些计算来减少时钟周期方面。

编辑 1

如所愿,我发布了我的测试代码。事实上,我发现了一个小错误,它们都以相同的速度运行。然而,如果有更好的实现,问题仍然存在。

哪个输出:

0 投票
1 回答
61 浏览

chess - 有没有更好的方法来用 Python 编写这段代码?(将 UCI-move 转化为 bitboard、国际象棋)

我想将 UCI-move 转换为 bitboard。

例如 a2a3 -> 32768, 8388608

我需要将 [7,6,...,0] 分配给 [a,b,...,h] 以便对于每个字母我都有分配的数字(n)来计算 2^n

然后我可以根据开始或结束字段左移 uci[1] 或 uci[3] *8 中的值。

这是我的方法,它看起来不太好和多余。

0 投票
1 回答
123 浏览

c++ - Stockfish 12 源代码:替换函数参数的模板

由于Stockfish是评价最高的国际象棋引擎,而且众所周知它的 CPU 效率很高,我决定打开它的源代码并尝试了解并了解它是如何工作的。

我遇到了这段代码,只是将位板移动到某个方向(北,南,东......)

取自 STOCKFISH 12 来源:下载

调用函数

在这种情况下需要有一个模板,为什么会这样

不行?第一种方法是否更有效?

0 投票
1 回答
794 浏览

bit-manipulation - 如何在国际象棋中使用位板?

我正在制作一个基于位板的国际象棋引擎,我想问一下——假设我为每一块都做了一个位板,我该怎么处理它?我读了一些关于一些技术的文章,比如如果你将棋子位板向左移动 7 和 9,你会得到一个代表他们攻击的方块的位板,但是我该如何使用它呢?或者我如何使用 rook bitboard 或 bishop bitboard?就像他们的目标是什么,如果我找到它,我如何将它与其他部分位板连接起来?我已经搜索了几天,但没有找到足够的答案......谢谢

0 投票
1 回答
118 浏览

python - 在 int 中的给定位置从左到右修改一点:

我一直在尝试提出一个函数,它被赋予一个 int 它将使用按位运算在给定位置进行一些修改:

例如:

修改位(int,pos)

modify_bit(0b10000, 1) 应该返回 0b11000

或者 modify_bit(0b10000, 6) 应该返回 0b100001

我已经进行了研究,但没有发现任何从左到右在位板上的给定位置修改位功能,而是我发现的所有功能,这可能是我正在寻找的从位置到右修改位的功能左边。

提前致谢!

0 投票
1 回答
150 浏览

javascript - Bitboard Javascript - 如何识别确切的棋子/位置正在攻击国王

我对位板和位操作了解不多,我从 Github 获得了一些位板国际象棋引擎的例子。我想知道是否有人可以帮助我解决问题。

我怎样才能确定攻击国王的确切棋子?

我在 position.js 的 isKingInCheck 函数中有一个示例,识别国王何时被攻击(甚至识别棋子是棋子还是象等),但我需要确切知道正在攻击的棋子(位置)国王。

我相信可以创建一个通用的攻击掩码函数,如下面的函数。问题是我不知道如何从在 position.js 文件中声明的预制位板上单独获取每个部件(及其在游戏中的位置)。

任何人都知道我怎样才能做到这一点?

0 投票
1 回答
261 浏览

java - 如何为魔术位板生成这个预初始化数组?

我目前正在尝试使我的国际象棋引擎更快,并且正在考虑为我的滑动块攻击生成实现魔术位板。我正在使用棋盘的位板表示,其中 a1 方格是最右边的位,而 h8 是最左边的位。我在看这个网站:

https://rhysre.net/fast-chess-move-generation-with-magic-bitboards.html#:~:text=A%20bitboard%20is%20simply%20a,and%20bit%2063%20%3D%20h8 )

特别是页面底部的代码片段,内容如下:

我已经有浅蓝色魔法数字(每个数字对应一个正方形),并且我已经为存储在 64 长度数组中的主教块预先初始化了攻击掩码(同样每个数字对应一个正方形)。所以我知道如何获得钥匙。但是如何生成最后一个带有键的数组“BISHOP_TABLE”数组?我不明白如何在给定每个正方形的攻击掩码和幻数的情况下生成该二维数组。提前谢谢你的帮助。

0 投票
1 回答
78 浏览

c++ - c++ 从 String 到 Bitboard 的转换和反向优化

我正在处理作为字符串接收的游戏状态,需要将其转换为 BitBoard。我相信我现在有一个功能可以实现这一点,但想知道如何优化它以加快执行速度?我最初是从一个带有以下想法的循环开始的:

但我想我可以展开循环并跳过“i”的比较和递增。这样做之后,我想我可以删除最后一个对“B”的检查,并接受 W | 的赞美。x 并从中减去 4286578688 得到 23 位。这给了我以下代码:

是否有任何其他技巧可以进一步优化此过程以提高速度?我不关心文件大小。

最后,我将如何将 board[W, B, x] 转换回字符串?(例如,玩家“W”在第 22 位添加了一个棋子,结果是boards[] = {1351745, 2163730, 4873132}。如何将其转换为:board = xBWxWxBWxWxxBxxxWxBxxBW?)

编辑:我得到了恢复到板的功能,如下所示:

0 投票
1 回答
120 浏览

c++ - 在使用位板的国际象棋引擎中,如何检测边缘?

例如,所有白兵的攻击都是通过向左移动 7 位或 9 位产生的(或者向右,我可能弄错了,但我认为这很容易理解要点)。

所以看起来像这样的白色棋子

00000000000000000000000000000000000000001111111100000000

将被转移到这个

00000000000000000000000000000001111111100000000000000000

但是,如果您尝试在 8x8 数组中描绘此示例,其中一个棋子会穿过棋盘的边缘。

那么当位被移动以产生攻击时,引擎如何防止自己产生穿过棋盘边缘的攻击呢?

0 投票
1 回答
67 浏览

c++ - 将位添加到整数 (cpp) 的意外输出

问题

你好,这是我的第一个堆栈溢出问题。我正在使用 Bit-boards 来表示我的国际象棋引擎中的棋盘状态。目前我有一个像这样的位板类:

我也有这个枚举(位于实际文件中的类上方):

我的问题是在 set square value 方法中调用:

TestBitboard.SetSquareValue(e2);

其次是:

TestBitboard.PrintBitboard();

给出一个奇怪的输出:

与我想要的输出相比:

我希望在 cpp 和位操作方面有更多经验的人可以解释为什么我得到这个输出。虽然我对编程并不陌生,但我对 cpp 还是陌生的,而且我以前从来没有搞乱过比特。

我试过的

我看过以下视频。我试图使用他们的类似功能的实现无济于事。

我还搞砸了代码交换值、尝试不同的枚举值等。

我能得到的最大改变是值 4503599627370496 改变为不同的东西,但仍然不是我想要的输出。