对数取整
以2为底取整的对数等价于2进制最高位是多少. 几种方法:
-
循环
-
两次翻转
1
2
3
4
5
6
7
8
9
10inline uint32_t
reverse(uint32_t x)
{
x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2);
x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4);
x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) << 16);
return x;
}
-
汇编
1
2
3
4
5
6
7
8
9
10
11
12inline uint32_t
bsr_highest_bit(uint32_t x)
{
if (!x) return 0;
uint32_t bit;
asm(
"bsr %1, %0"
: "=r" (bit)
: "r" (x)
);
return (1 << bit);
}
对数小数
1-N的最小公倍数
素数打表,然后求$ prodlimits_{i = 1}^{n} P_{i}^{lfloor log_{P_{i}}Nrfloor} $ ,求对数的部分截止到$sqrt [] n$即可.
1 |
const int MAX=1e6; |
近期评论