我需要一种快速的方法来获取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) 我想找到n最低设置位的位置而不是最低设置位.(我不是在谈论n第四位的价值)
例如,说我有:
0000 1101 1000 0100 1100 1000 1010 0000
我想找到第4位设置.然后我希望它返回:
0000 0000 0000 0000 0100 0000 0000 0000
如果popcnt(v) < n,这个函数返回会有意义0,但是对于我这个案例的任何行为都是可以接受的.
如果可能的话,我正在寻找比循环更快的东西.
我正在为日本象棋变体编写一个表库。为了索引表基数,我将每个国际象棋位置编码为整数。在编码步骤之一中,我对棋盘上棋子的位置进行编码。由于实际方法有点复杂,我就简单地解释一下这个问题。
\n在残局桌面中,我有(比方说)六个不同的棋子,我想将它们分布在有 9 个方格的棋盘上。我可以 na\xc3\xafvely 用六元组 ( a , b , c , d , e , f \xe2\x80\x89 ) 表示它们的位置,其中每个变量a到f是 0 到 f 范围内的数字8 包括指示相应棋子所在位置的位置。
\n然而,这种表示并不是最佳的:没有两个棋子可以占据同一个方格,但前面提到的编码很高兴地允许这样做。我们可以通过六元组 [ a, b', c', d', e', f' \xe2\x80\x89] 编码相同的位置,其中a与之前的a相同, b'是来自0 到 7(含),表示第二块所在方格的编号。这是通过为第一块不在的每个方格分配一个从 0 到 7 的数字来实现的。例如,如果第一块在方格 3 上,则第二块的方格数为:
\n1st 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 ×2
algorithm ×1
binary ×1
c++ ×1
chess ×1
compression ×1
encoding ×1
function ×1
optimization ×1
performance ×1