[ create a new paste ] login | about

Link: http://codepad.org/MQeUVaiK    [ raw code | output | fork ]

k06a - C, pasted on Aug 18:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Copyright 2013 (c) Anton Bukov - https://github.com/k06a
// Inspired by http://graphics.stanford.edu/~seander/bithacks.html

#define P0(a) (a)
#define P1(a) (((P0(a) & 0x55555555) <<  1) | ((P0(a) & 0xAAAAAAAA) >>  1))
#define P2(a) (((P1(a) & 0x33333333) <<  2) | ((P1(a) & 0xCCCCCCCC) >>  2))
#define P3(a) (((P2(a) & 0x0F0F0F0F) <<  4) | ((P2(a) & 0xF0F0F0F0) >>  4))
#define P4(a) (((P3(a) & 0x00FF00FF) <<  8) | ((P3(a) & 0xFF00FF00) >>  8))
#define P5(a) (((P4(a) & 0x0000FFFF) << 16) | ((P4(a) & 0xFFFF0000) >> 16))

int log2(int n)
{
    union { float f; unsigned i; } fi = { (float)(P5(n) & -P5(n)) };
    return 31 - ((fi.i >> 23) - 0x7f);
}

void main()
{
    printf("%i", log2(3000000));
}


Output:
1
21


Create a new paste based on this one


Comments: