Click here to Skip to main content
16,005,389 members
Home / Discussions / C#
   

C#

 
AnswerRe: Base 2 Log Method Pin
led mike29-Nov-07 5:35
led mike29-Nov-07 5:35 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 6:13
Skippums29-Nov-07 6:13 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 7:46
sitebuilderLuc Pattyn29-Nov-07 7:46 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 8:12
Skippums29-Nov-07 8:12 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 8:39
sitebuilderLuc Pattyn29-Nov-07 8:39 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 8:59
Skippums29-Nov-07 8:59 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 9:18
sitebuilderLuc Pattyn29-Nov-07 9:18 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 9:37
Skippums29-Nov-07 9:37 
I don't know if you care, but the results when operating on 64 bit integers are extremely interesting. All the methods start with a zero check, which I omitted to keep this post minimal, and myType is System.Uint64. Here are the methods and the results using the same number of operations as I did for 32 bit integers (0x1000000 each):

Method1
byte high = sizeof(myType) << 3;
byte med  = (byte)(high >> 1);
byte low  = 0;
myType tmp = val >> med;
while (tmp != 1) {
    if (tmp == 0)
        high = med;
    else
        low  = med;
    med = (byte)(low + high >> 1);
    tmp = val >> med;
}
return med;
Method2
byte shift = (byte)(sizeof(myType) << 2);
myType mask = myType.MaxValue >> shift;
byte rval = 0;
do {
    if (val > mask) {
        rval += shift;
        val >>= shift;
    }
    shift >>= 1;
    mask  >>= shift;
} while (shift > 0);
return rval;
Method3
byte res = 0;
if (val > 0xFFFFFFFF) { res += 32; val >>= 32; }
if (val > 0x0000FFFF) { res += 16; val >>= 16; }
if (val > 0x000000FF) { res +=  8; val >>=  8; }
if (val > 0x0000000F) { res +=  4; val >>=  4; }
if (val > 0x00000003) { res +=  2; val >>=  2; }
if (val > 0x00000001) ++res;
return res;
Results
           Gross     Net
Method 1  1366 ms   892 ms
Method 2  2093 ms  1619 ms
Method 3   949 ms   475 ms
Control    474 ms     0 ms

I guess that being able to exit early (as in method 1) REALLY pays off as opposed to how it is being done in method 2 (which, if you remember, tied within 10 ms for 32 bit integers).

Jeff
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 9:56
sitebuilderLuc Pattyn29-Nov-07 9:56 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 10:19
mvePIEBALDconsult29-Nov-07 10:19 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 10:36
sitebuilderLuc Pattyn29-Nov-07 10:36 
JokeRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 13:06
mvePIEBALDconsult29-Nov-07 13:06 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 13:23
sitebuilderLuc Pattyn29-Nov-07 13:23 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 13:43
mvePIEBALDconsult29-Nov-07 13:43 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 14:02
sitebuilderLuc Pattyn29-Nov-07 14:02 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 10:26
mvePIEBALDconsult29-Nov-07 10:26 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 10:45
Skippums29-Nov-07 10:45 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 13:03
mvePIEBALDconsult29-Nov-07 13:03 
GeneralRe: Base 2 Log Method Pin
Skippums29-Nov-07 13:21
Skippums29-Nov-07 13:21 
GeneralRe: Base 2 Log Method [modified] Pin
PIEBALDconsult29-Nov-07 14:15
mvePIEBALDconsult29-Nov-07 14:15 
GeneralRe: Base 2 Log Method Pin
Skippums30-Nov-07 5:19
Skippums30-Nov-07 5:19 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult30-Nov-07 10:25
mvePIEBALDconsult30-Nov-07 10:25 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult3-Dec-07 11:07
mvePIEBALDconsult3-Dec-07 11:07 
GeneralRe: Base 2 Log Method Pin
Luc Pattyn29-Nov-07 13:39
sitebuilderLuc Pattyn29-Nov-07 13:39 
GeneralRe: Base 2 Log Method Pin
PIEBALDconsult29-Nov-07 13:48
mvePIEBALDconsult29-Nov-07 13:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.