User:Talarus Luan/IntegerLog

From Second Life Wiki
Jump to navigation Jump to search

Fast way to get a base 2 log (aka the Most Significant Bit (MSB) position) of a 32-bit integer:

<lsl>integer IntegerLog(integer piData) {

   integer liMask;
   integer liShift;
   integer liMSB;
       
   for (liShift = 16, liMask = 0xFFFF0000, liMSB = 0;
        liShift > 0;
        liShift = liShift >> 1, 
            liMask = (liMask >> liShift) & ~liMask) {
            
       if ((liMask & piData) != 0) {
           liMSB += liShift;
           piData = piData >> liShift;
       }
   }
   return liMSB;

}</lsl>

Can be used to detect a potential integer math overflow for multiply:

<lsl>if ((IntegerLog(N1)+IntegerLog(N2)) < 31)

   M = N1 * N2; // safe multiply

else

   llOwnerSay("Overflow!");</lsl>