User:Talarus Luan/IntegerLog
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>