【问题标题】:Is it possible to determine specific digits of 64 bit number in C是否可以在C中确定64位数字的特定数字
【发布时间】:2017-11-27 17:12:44
【问题描述】:

我正在尝试制作一个国际象棋引擎。我做了一些阅读,似乎使用 64 位数字来表示板是要走的路。但是我有点困惑,似乎没有简单的方法可以用二进制写一个数字,而且我也找不到在数字中选择一个数字的方法。例如,如果我这样做

    int aNum = 356;
    b = aNum[1];

有没有办法让我可以将 b 设置为 5?在程序中它是一个二进制数,如 1001010101,我想知道当我经过那里时所有 1 都在哪里。例如,如果我有一辆汽车并且我正在寻找可能的向右移动,我会让它遍历数字直到找到 1。

希望这很容易理解,谢谢!


问题在于对为何在国际象棋引擎中使用 64 位数字存在根本性的误解。实际上,这样做的好处是,如果您想检查方块上的项目,您可以执行类似boardRep & 1 之类的操作,它将检查棋盘的第一个方块上的元素。

【问题讨论】:

  • 我不确定 64 位数字是否有意义。每个方块可以包含六块中的任何一块(任何一种颜色),或者是空的。每个二进制数字代表什么?
  • "遍历数字直到找到 1" - 这相当简单,使用几个按位操作(例如,>>|)。
  • 我真的建议您忘记这些微优化并寻求有意义的表示。例如 8x8 数组,其中包含代表棋子的数字。也许更复杂的东西。
  • 据我所知,bitboards 绝对是国际象棋编程中的一员。您可能会发现这个chess programming website 是一个有用的资源。
  • 位板的力量来自于对位进行迭代。重点在于启用大部分避免此类循环的技巧。

标签: c binary bit-manipulation chess


【解决方案1】:

如果您想获取 64 位数字的十进制表示中的特定数字(这不是我认为您想要做的),您首先必须创建该十进制表示。基本配方是这样的:

uint64_t x = 123456789012345;
char buf[30];
snprintf(buf, sizeof(buf), "%lld", x);
int digit5 = buf[5] - '0';
printf("digit [5] = %d\n", digit5);

这应该打印6

请记住,它不是一个 64 位 数字 的数字。 (最大的 64 位数字有 20 个十进制数字。)

也许你想提取 bit 数字 n。为此,您需要一些按位运算,可能是这样的:

int bit5 = (x >> 5) & 0x01;
printf("bit 5 = %d\n", bit5);

或者如果你只是想测试一下,你可以这样做

if(x & (1 << 5)) printf("bit 5 is true\n");

或者您可以预先计算一些位掩码:

unsigned long long int masks[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, /* ... */ };

if(x & masks[5]) printf("bit 5 is true\n");

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多