Difference between revisions of "Hex"

From Second Life Wiki
Jump to navigation Jump to search
(→‎Demo: add the astonishing 0x123456789 example (saturates at min neg equal to max unsigned, rather than rolling over in two's complement like C often does))
m (→‎Demo: add labels to make the results easier to review at a glance)
Line 63: Line 63:
     {
     {
         llOwnerSay("Hello");
         llOwnerSay("Hello");
         llOwnerSay(hex(0));
         llOwnerSay(hex(0) + " == 0");
         llOwnerSay(hex(0x00FEDC00 & -0x00FEDC00));
         llOwnerSay(hex(0x00FEDC00 & -0x00FEDC00) + " == (0x00FEDC00 & -0x00FEDC00)");
         llOwnerSay(hex(1 << 30));
         llOwnerSay(hex(1 << 30) + " == (1 << 30)");
         llOwnerSay(hex(1 << 31));
         llOwnerSay(hex(1 << 31) + " == (1 << 31)");
         llOwnerSay(hex(0xFEDC9876));
         llOwnerSay(hex(0xFEDC9876) + " == 0xFEDC9876");
         llOwnerSay(hex(-1));
         llOwnerSay(hex(-1) + " == -1");
         llOwnerSay(hex(0x123456789));
         llOwnerSay(hex(0x123456789) + " == 0x123456789");
         llOwnerSay("OK");
         llOwnerSay("OK");
          
          
         llOwnerSay("Hello again");
         llOwnerSay("Hello again");
         string item = llGetScriptName();
         string item = llGetScriptName();
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_BASE)));
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_BASE)) + " as base");
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_OWNER)));
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_OWNER)) + " by owner");
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_GROUP)));
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_GROUP)) + " by group");
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_EVERYONE)));
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_EVERYONE)) + " by anyone");
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_NEXT)));
         llOwnerSay(hex(llGetInventoryPermMask(item, MASK_NEXT)) + " by next owner");
         llOwnerSay((string) llGetInventoryPermMask(item, MASK_NEXT));
         llOwnerSay((string) llGetInventoryPermMask(item, MASK_NEXT) + " by next owner");
         llOwnerSay("OK");
         llOwnerSay("OK");
     }
     }
Line 88: Line 88:
<pre>
<pre>
Hello
Hello
0x0
0x0 == 0
0x400
0x400 == (0x00FEDC00 & -0x00FEDC00)
0x40000000
0x40000000 == (1 << 30)
-0x80000000
-0x80000000 == (1 << 31)
-0x123678a
-0x123678a == 0xFEDC9876
-0x1
-0x1 == -1
-0x1
-0x1 == 0x123456789
OK
OK
Hello again
Hello again
0x7fffffff
0x7fffffff as base
0x7fffffff
0x7fffffff by owner
0x0
0x0 by group
0x0
0x0 by anyone
0x82000
0x82000 by next owner
532480
532480 by next owner
OK
OK
</pre>
</pre>

Revision as of 21:39, 9 October 2007

Function: string hex(integer value);

Returns the hexadecimal nybbles of the signed integer value, in order, prefixed by "0x" or by "-0x", without any leading zeroes.

Parameters:

• integer value value to be converted

This function works like the hex function of the Python scripting language, doc'ed within http://docs.python.org/lib/built-in-funcs.html. Specifically, this function returns a signed 31-bit result if negative, rather than a 32-bit result. and this function returns the easier-to-type lower case nybbles a la AT&T, rather than the easier-to-read upper case nybbles a la IBM.

Implementation

// http://wiki.secondlife.com/wiki/Hex

string HEXC = "0123456789ABCDEF";

string hexu(integer value)
{
    integer ny = (value & 0xF);
    string nybbles = llGetSubString(HEXC, ny, ny);
    value = (0xfffFFFF & (value >> 4));
    if (value)
    {
        do
        {
            ny = (value & 0xF);
            nybbles = llGetSubString(HEXC, ny, ny) + nybbles;
            value = (value >> 4);
        } while (value);
    }
    return "0x" + nybbles;
}

string hex(integer value)
{
    if (value == (1 << 31)) return "-0x80000000";
    if (value < 0) return "-" + hex(-value);
    return llToLower(hexu(value));
}

Demo

Print the most astonishing test cases and then also the permission masks of a script.

Code:

default
{
    state_entry()
    {
        llOwnerSay("Hello");
        llOwnerSay(hex(0) + " == 0");
        llOwnerSay(hex(0x00FEDC00 & -0x00FEDC00) + " == (0x00FEDC00 & -0x00FEDC00)");
        llOwnerSay(hex(1 << 30) + " == (1 << 30)");
        llOwnerSay(hex(1 << 31) + " == (1 << 31)");
        llOwnerSay(hex(0xFEDC9876) + " == 0xFEDC9876");
        llOwnerSay(hex(-1) + " == -1");
        llOwnerSay(hex(0x123456789) + " == 0x123456789");
        llOwnerSay("OK");
        
        llOwnerSay("Hello again");
        string item = llGetScriptName();
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_BASE)) + " as base");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_OWNER)) + " by owner");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_GROUP)) + " by group");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_EVERYONE)) + " by anyone");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_NEXT)) + " by next owner");
        llOwnerSay((string) llGetInventoryPermMask(item, MASK_NEXT) + " by next owner");
        llOwnerSay("OK");
    }
}

Sample results:

Hello
0x0 == 0
0x400 == (0x00FEDC00 & -0x00FEDC00)
0x40000000 == (1 << 30)
-0x80000000 == (1 << 31)
-0x123678a == 0xFEDC9876
-0x1 == -1
-0x1 == 0x123456789
OK
Hello again
0x7fffffff as base
0x7fffffff by owner
0x0 by group
0x0 by anyone
0x82000 by next owner
532480 by next owner
OK