国际象棋棋盘上所需的最小比特数

时间:2013-09-02 04:03:34

标签: data-structures bit-manipulation chess

这是一个采访问题:

8x8棋盘上两个位置的最小位数是多少?

我找到了答案http://www.careercup.com/question?id=4981467352399872

但是当她说:

时,我无法理解作者试图传达的内容
  

您可以用n位表示2 ^ n个值。但是,你可以代表   2 ^ n + 2 ^(n-1)+ 2 ^(n-2)+ ... 1 = 2 ^(n + 1) - 1个值 atmost n   位。因此,您可以使用just表示2 ^ 11 - 1 = 2047个不同的值   10位。

我不是在寻求作者在他的答案中提出的建议的解释,但我更感兴趣的是解决问题本身。据我所知,由于有64C2 = 2016种方法在8x8板上表示两个部分,所需的最小位数应为​​11.但有人建议只能使用10位代表董事会。怎么样?

2 个答案:

答案 0 :(得分:2)

作者说您可以使用5,6,7,8,9和10位值表示位置。

在二进制2016中是11111100000(1024 + 512 + 256 + 128 + 64 + 32)

5 bits  (00000 -      11111) represent 32 positions
6 bits  (000000 -     111111) represent 64 positions
7 bits  (0000000 -    1111111) represent 128 positions
8 bits  (00000000 -   11111111) represent 256 positions
9 bits  (000000000 -  111111111) represent 512 positions
10 bits (0000000000 - 1111111111) represent 1024 positions

总共2016年的职位。

这可以用具有比特集合的语言实现,例如C ++ bitset,它有一个大小函数来获取长度。

以下是2x2电路板的示例,希望能更好地解释这一点。

对于2x2板,有4C2(6)个位置

.x  x.  ..  xx  .x  x.
.x  x.  xx  ..  x.  .x

所以你可以使用3位000,001,010,011,100,101和110

但是6是二进制110(4 + 2)所以你可以使用1位(0-1)表示2个位置,2位(00,01,10,11)表示其余4位。所以位置是:

0,1,00,01,10,11。

答案 1 :(得分:0)

要回答问题并获得整数解,您必须评估以下等式:

bits = ceil(log2(combination(64,2)));
bits = ceil(log2(64!/(62!*2!)));
bits = ceil(log2(64*63/2));
bits = ceil(log2(32*63));
bits = ceil(log2(32)+log2(63));
bits = ceil(5+log2(63));
bits = ceil(5+5.97728);
bits = 11;

得出等式需要combinatorics的工作知识。

combination(64,2)表示选择264个唯一空格的方式的数量。