相关疑难解决方法(0)

返回64位整数中所有设置位的最快方法是什么?

我需要一种快速的方法来获取64位整数中所有位的位置.例如,给定x = 123703,我想填充一个数组idx[] = {0, 1, 2, 4, 5, 8, 9, 13, 14, 15, 16}.我们可以假设我们先验地知道比特数.这将被称为10 ^ 12 - 10 ^ 15次,因此速度至关重要.到目前为止,我提出的最快答案是以下怪物,它使用64位整数的每个字节作为表的索引,这些表给出了在该字节中设置的位数以及这些位的位置:

int64_t x;            // this is the input
unsigned char idx[K]; // this is the array of K bits that are set
unsigned char *dst=idx, *src;
unsigned char zero, one, two, three, four, five;  // these hold the 0th-5th bytes
zero  =  x & 0x0000000000FFUL;
one   = (x & 0x00000000FF00UL) >> 8;
two   = (x & …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization performance bit-manipulation

40
推荐指数
3
解决办法
4877
查看次数

在int中找到第n个SET位

我想找到n最低设置位的位置而不是最低设置位.(我不是在谈论n第四位的价值)

例如,说我有:
0000 1101 1000 0100 1100 1000 1010 0000

我想找到第4位设置.然后我希望它返回:
0000 0000 0000 0000 0100 0000 0000 0000

如果popcnt(v) < n,这个函数返回会有意义0,但是对于我这个案例的任何行为都是可以接受的.

如果可能的话,我正在寻找比循环更快的东西.

algorithm binary function

20
推荐指数
4
解决办法
5248
查看次数

如何有效地编码/解码压缩的位置描述?

我正在为日本象棋变体编写一个表库。为了索引表基数,我将每个国际象棋位置编码为整数。在编码步骤之一中,我对棋盘上棋子的位置进行编码。由于实际方法有点复杂,我就简单地解释一下这个问题。

\n

编码

\n

在残局桌面中,我有(比方说)六个不同的棋子,我想将它们分布在有 9 个方格的棋盘上。我可以 na\xc3\xafvely 用六元组 ( a , b , c , d , e , f \xe2\x80\x89 ) 表示它们的位置,其中每个变量af是 0 到 f 范围内的数字8 包括指示相应棋子所在位置的位置。

\n

然而,这种表示并不是最佳的:没有两个棋子可以占据同一个方格,但前面提到的编码很高兴地允许这样做。我们可以通过六元组 [ a, b', c', d', e', f' \xe2\x80\x89] 编码相同的位置,其中a与之前的a相同, b'是来自0 到 7(含),表示第二块所在方格的编号。这是通过为第一块不在的每个方格分配一个从 0 到 7 的数字来实现的。例如,如果第一块在方格 3 上,则第二块的方格数为:

\n
1st piece: 0 1 2 3 4 5 6 7 8\n2nd piece: 0 1 2 - 3 4 5 6 7\n …
Run Code Online (Sandbox Code Playgroud)

c compression encoding chess

5
推荐指数
1
解决办法
1094
查看次数