Chris Knox
Member
Join date: 22 Apr 2004
Posts: 40

11082004 14:53
Someone once asked me in a sandbox if I knew how to detect even or odd. I couldn't think of it then, and I forgot the person's name, but here it is now. Hoping this can help anyone. If you want help adapting this for your script just IM me in world. //Even/Odd from Chris Knox
float n; float m;
default { state_entry() { n = 0; }
touch_start(integer total_number) { m = (n + 1); float number = n; float tell = llRound(number / 2); if ((tell * 2) == number) { llSay(0, (string)llRound(number) + " is even."); } else { llSay(0, (string)llRound(number) + " is odd."); } n = m; } }

Zuzi Martinez
goth dachshund
Join date: 4 Sep 2004
Posts: 1,860

11092004 02:52
you can also do it this way. my script is probably sloppy but the method seems to work alright. string OddOrEven(integer n) { if (!n) return "i dunno if zero is odd or even."; integer temp = n % 2; if (temp) return (string)n +" is odd."; else return (string)n +" is even."; }
default { state_entry() { // replace 11 with whatever number you want to check. llSay(0, OddOrEven(11)); } }

Neo Rebus
Registered User
Join date: 10 Apr 2004
Posts: 59

11092004 07:26
It's much easier: if (number % 2 == 0) { llSay(0, (string)number + " is even." ; } if (number % 2 == 1) { llSay(0, (string)number + " is odd." ; } From: Chris Knox Someone once asked me in a sandbox if I knew how to detect even or odd. I couldn't think of it then, and I forgot the person's name, but here it is now. Hoping this can help anyone. If you want help adapting this for your script just IM me in world. //Even/Odd from Chris Knox
float n; float m;
default { state_entry() { n = 0; }
touch_start(integer total_number) { m = (n + 1); float number = n; float tell = llRound(number / 2); if ((tell * 2) == number) { llSay(0, (string)llRound(number) + " is even."); } else { llSay(0, (string)llRound(number) + " is odd."); } n = m; } }

Apotheus Silverman
I write code.
Join date: 17 Nov 2003
Posts: 416

11092004 09:31
// Returns TRUE if testNumber is even, FALSE otherwise integer IsEven(integer testNumber) { if (testNumber % 2 == 0) { return(TRUE); } return(FALSE); }

Xylor Baysklef
Scripting Addict
Join date: 4 May 2003
Posts: 109

11092004 10:04
Or, you could use the modulus operator: (pseudo code) if (some_integer % 2 == 0) then some_integer is even else some_integer is odd
Xylor

Lorn Prefect
Second Life Resident
Join date: 4 Nov 2004
Posts: 4

11092004 20:19
Simpler method given 'integer n'
integer isOdd = n & 1;
This does a bitwise comparison; if the number is odd, the low bit (1) is set  no even number can have the low bit set, since the rest of the bits are all evens, and even+even number = even.

Lorn Prefect
Second Life Resident
Join date: 4 Nov 2004
Posts: 4

11092004 20:45
Try this... given 'integer n':
integer isOdd = n & 1;
This will do a bitwise comparison; if a number is odd, the low bit (the only odd bit  1), will be set.

Lorn Prefect
Second Life Resident
Join date: 4 Nov 2004
Posts: 4

Try bitwise...
11092004 20:45
Try this... given 'integer n':
integer isOdd = n & 1;
This will do a bitwise comparison; if a number is odd, the low bit (the only odd bit  1), will be set.

Lorn Prefect
Second Life Resident
Join date: 4 Nov 2004
Posts: 4

11092004 22:52
Even better... Given 'integer n':
integer isOdd = n & 1;
This will do a bitwise comparison; if a number is odd, it's lowest bit (1) is set.

Lorn Prefect
Second Life Resident
Join date: 4 Nov 2004
Posts: 4

11092004 22:53
Even better... Given 'integer n':
integer isOdd = n & 1;
This will do a bitwise comparison; if a number is odd, it's lowest bit (1) is set.
Given float n, cast it to an integer:
integer isOdd = (integer)n & 1;
Floats cast to integers drop the decimal. If you want it rounded to nearest:
integer isOdd = (integer)(n + 0.5) & 1;

Samhain Broom
Registered User
Join date: 1 Aug 2004
Posts: 298

11122004 12:50
From: Lorn Prefect Even better... Given 'integer n':
integer isOdd = n & 1;
This will do a bitwise comparison; if a number is odd, it's lowest bit (1) is set.
Given float n, cast it to an integer:
integer isOdd = (integer)n & 1;
Floats cast to integers drop the decimal. If you want it rounded to nearest:
integer isOdd = (integer)(n + 0.5) & 1; In some languages, the "n" will be ANDed with the 1, and the result "isOdd" will be TRUE or FALSE but the value of "n" will still be changed. If "n" is a "throw away" variable, that's not a problem. The method used by Xylor does not change the variable. I do not mean to be picky, but if you were tight on memory, the Modulo version of "Even/Odd" discovery is best. And of course this applies to any value. IE, is it divisible by x? llWhisper(0, "Divisible by " + (string)x) && (number % x) == 0; Hmmm well, a similar method like that works in PERL, =)
_____________________
rm rf /bin/ladden #beware of geeks bearing grifts

Jack Wishbringer
Second Life Resident
Join date: 9 Nov 2004
Posts: 41

11152004 06:40
Just a minor point in response to the last post; but "n & 1" will not store the result back in n; the value of n is preserved.
To store the result back in n, you'd use n = n & 1; or n &= 1;.
Jack
