19 0x0000000000000001ULL, 0x0000000000000002ULL, 0x0000000000000004ULL, 0x0000000000000008ULL,
20 0x0000000000000010ULL, 0x0000000000000020ULL, 0x0000000000000040ULL, 0x0000000000000080ULL,
21 0x0000000000000100ULL, 0x0000000000000200ULL, 0x0000000000000400ULL, 0x0000000000000800ULL,
22 0x0000000000001000ULL, 0x0000000000002000ULL, 0x0000000000004000ULL, 0x0000000000008000ULL,
23 0x0000000000010000ULL, 0x0000000000020000ULL, 0x0000000000040000ULL, 0x0000000000080000ULL,
24 0x0000000000100000ULL, 0x0000000000200000ULL, 0x0000000000400000ULL, 0x0000000000800000ULL,
25 0x0000000001000000ULL, 0x0000000002000000ULL, 0x0000000004000000ULL, 0x0000000008000000ULL,
26 0x0000000010000000ULL, 0x0000000020000000ULL, 0x0000000040000000ULL, 0x0000000080000000ULL,
27 0x0000000100000000ULL, 0x0000000200000000ULL, 0x0000000400000000ULL, 0x0000000800000000ULL,
28 0x0000001000000000ULL, 0x0000002000000000ULL, 0x0000004000000000ULL, 0x0000008000000000ULL,
29 0x0000010000000000ULL, 0x0000020000000000ULL, 0x0000040000000000ULL, 0x0000080000000000ULL,
30 0x0000100000000000ULL, 0x0000200000000000ULL, 0x0000400000000000ULL, 0x0000800000000000ULL,
31 0x0001000000000000ULL, 0x0002000000000000ULL, 0x0004000000000000ULL, 0x0008000000000000ULL,
32 0x0010000000000000ULL, 0x0020000000000000ULL, 0x0040000000000000ULL, 0x0080000000000000ULL,
33 0x0100000000000000ULL, 0x0200000000000000ULL, 0x0400000000000000ULL, 0x0800000000000000ULL,
34 0x1000000000000000ULL, 0x2000000000000000ULL, 0x4000000000000000ULL, 0x8000000000000000ULL,
40 0x0000000000000302ULL, 0x0000000000000705ULL, 0x0000000000000e0aULL, 0x0000000000001c14ULL,
41 0x0000000000003828ULL, 0x0000000000007050ULL, 0x000000000000e0a0ULL, 0x000000000000c040ULL,
42 0x0000000000030203ULL, 0x0000000000070507ULL, 0x00000000000e0a0eULL, 0x00000000001c141cULL,
43 0x0000000000382838ULL, 0x0000000000705070ULL, 0x0000000000e0a0e0ULL, 0x0000000000c040c0ULL,
44 0x0000000003020300ULL, 0x0000000007050700ULL, 0x000000000e0a0e00ULL, 0x000000001c141c00ULL,
45 0x0000000038283800ULL, 0x0000000070507000ULL, 0x00000000e0a0e000ULL, 0x00000000c040c000ULL,
46 0x0000000302030000ULL, 0x0000000705070000ULL, 0x0000000e0a0e0000ULL, 0x0000001c141c0000ULL,
47 0x0000003828380000ULL, 0x0000007050700000ULL, 0x000000e0a0e00000ULL, 0x000000c040c00000ULL,
48 0x0000030203000000ULL, 0x0000070507000000ULL, 0x00000e0a0e000000ULL, 0x00001c141c000000ULL,
49 0x0000382838000000ULL, 0x0000705070000000ULL, 0x0000e0a0e0000000ULL, 0x0000c040c0000000ULL,
50 0x0003020300000000ULL, 0x0007050700000000ULL, 0x000e0a0e00000000ULL, 0x001c141c00000000ULL,
51 0x0038283800000000ULL, 0x0070507000000000ULL, 0x00e0a0e000000000ULL, 0x00c040c000000000ULL,
52 0x0302030000000000ULL, 0x0705070000000000ULL, 0x0e0a0e0000000000ULL, 0x1c141c0000000000ULL,
53 0x3828380000000000ULL, 0x7050700000000000ULL, 0xe0a0e00000000000ULL, 0xc040c00000000000ULL,
54 0x0203000000000000ULL, 0x0507000000000000ULL, 0x0a0e000000000000ULL, 0x141c000000000000ULL,
55 0x2838000000000000ULL, 0x5070000000000000ULL, 0xa0e0000000000000ULL, 0x40c0000000000000ULL,
76 #if defined(USE_GAS_X64)
77 __asm__(
"popcntq %1,%0" :
"=r" (b) :
"rm" (b));
79 #elif defined(USE_MSVC_X64)
81 #elif defined(USE_GCC_X64)
82 return __builtin_popcountll(b);
86#elif defined (USE_GAS_MMX)
88 const unsigned long long M55 = 0x5555555555555555ULL;
89 const unsigned long long M33 = 0x3333333333333333ULL;
90 const unsigned long long M0F = 0x0F0F0F0F0F0F0F0FULL;
95 "pxor %%mm2, %%mm2\n\t"
97 "movq %%mm1, %%mm0\n\t"
100 "psubd %%mm1, %%mm0\n\t"
102 "movq %%mm0, %%mm1\n\t"
103 "psrlq $2, %%mm0\n\t"
106 "paddd %%mm1, %%mm0\n\t"
108 "movq %%mm0, %%mm1\n\t"
109 "psrlq $4, %%mm0\n\t"
110 "paddd %%mm1, %%mm0\n\t"
113 "psadbw %%mm2, %%mm0\n\t"
116 :
"=a" (
count) :
"m" (b),
"m" (M55),
"m" (M33),
"m" (M0F));
122 register unsigned long long c = b
123 - ((b >> 1) & 0x7777777777777777ULL)
124 - ((b >> 2) & 0x3333333333333333ULL)
125 - ((b >> 3) & 0x1111111111111111ULL);
126 c = ((c + (c >> 4)) & 0x0F0F0F0F0F0F0F0FULL) * 0x0101010101010101ULL;
128 return (
int)(c >> 56);
175#if defined(USE_GAS_X64)
177 __asm__(
"bsfq %1,%0" :
"=r" (b) :
"rm" (b));
180#elif defined(USE_GAS_X86)
183 __asm__ (
"bsf %0,%0\n"
188 "1:":
"=&q" (x1),
"=&q" (x2):
"1" ((
int) (b >> 32)),
"0" ((
int) b));
191#elif defined(USE_MSVC_X64)
194 _BitScanForward64(&index, b);
197#elif defined(USE_GCC_X64)
199 return __builtin_ctzll(b);
201#elif defined(USE_MASM_X86)
206 bsf edx, dword ptr b+4
213#elif defined(USE_GCC_ARM)
214 const unsigned int lb = (
unsigned int)b;
216 return __builtin_clz(lb & -lb) ^ 31;
218 const unsigned int hb = b >> 32;
219 return 32 + (__builtin_clz(hb & -hb) ^ 31);
224 const int magic[64] = {
225 63, 0, 58, 1, 59, 47, 53, 2,
226 60, 39, 48, 27, 54, 33, 42, 3,
227 61, 51, 37, 40, 49, 18, 28, 20,
228 55, 30, 34, 11, 43, 14, 22, 4,
229 62, 57, 46, 52, 38, 26, 32, 41,
230 50, 36, 17, 19, 29, 10, 13, 21,
231 56, 45, 25, 31, 35, 16, 9, 12,
232 44, 24, 15, 8, 23, 7, 6, 5
235 return magic[((b & (-b)) * 0x07EDD5E59A4E28C2ULL) >> 58];
266#if defined(USE_GAS_X64)
268 __asm__(
"bsrq %1,%0" :
"=r" (b) :
"rm" (b));
271#elif defined(USE_MSVC_X64)
274 _BitScanReverse64(&index, b);
277#elif defined(USE_GCC_X64)
279 return 63 - __builtin_clzll(b);
281#elif defined(USE_GAS_X86)
284 __asm__ (
"bsr %1,%0\n"
288 "1: addl $32,%0\n" :
"=&q" (x1),
"=&q" (x2) :
"1" ((
int) (b >> 32)),
"0" ((
int) b));
292#elif defined(USE_GCC_ARM)
293 const unsigned int hb = b >> 32;
295 return 63 - __builtin_clz(hb);
297 return 31 - __builtin_clz((
int) b);
301#elif defined(USE_MASM_X86)
304 bsr edx, dword ptr b+4
316 const int magic[64] = {
317 63, 0, 58, 1, 59, 47, 53, 2,
318 60, 39, 48, 27, 54, 33, 42, 3,
319 61, 51, 37, 40, 49, 18, 28, 20,
320 55, 30, 34, 11, 43, 14, 22, 4,
321 62, 57, 46, 52, 38, 26, 32, 41,
322 50, 36, 17, 19, 29, 10, 13, 21,
323 56, 45, 25, 31, 35, 16, 9, 12,
324 44, 24, 15, 8, 23, 7, 6, 5
335 return magic[(b * 0x07EDD5E59A4E28C2ULL) >> 58];