Hex: Difference between revisions
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 20:39, 9 October 2007
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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