Is there a way to test if a number is even?
Blitz3D Forums/Blitz3D Beginners Area/Is there a way to test if a number is even?
| ||
Read the title then please answer me. If theres not a blitz function, can anyone think of a way to do this? |
| ||
abs(x) mod 2 has to equal zero for x to be even, a result of one signifies that x is odd. |
| ||
First, thanks for helping me and second, What are you doing there though can you explain? |
| ||
nvm i looked at the Blitz Docs |
| ||
If the number is an integer you can do this: If (A AND 1) = 0 Then Even What that does is a bitwise and of the binary representation of A and the binary representation of the value 1. The binary representation of the value 1 is all 0's, except the first bit, which is 1. The first bit adds either 0 or 1 to the total number, the second bit adds either 0 or 2... the third add either 0 or 4... Ie: 0 = 000 1 = 001 2 = 010 3 = 011 4 = 100 If we AND two integers together, then we get a number which only has bits set to 1 where they are 1 in BOTH numbers. Since we only have one bit here set to 1, then the result can only be based on that bit. And that bit controls whether 0 or 1 is added to the number, so out result will either be 0 or 1 depeding on whether A as a 1 at that bit position... And A will only have a 1 at that bit position if it is ODD, as the table above shows. Now, if you want to do floats, that's more complicated, and I'm not sure if a number like 1.1 can even be consideerd odd or even. But if you only want to use the whole part of the float, the part to the left of the decimal point then you can do this: If (Floor(A#) AND 1) = 0 Then Even And that will cut off everything after the decimal point before doing the comparison. |
| ||
Sledge: The abs() really isn't even neccessary to do it that way... The number is even if A mod 2 is 0, and it is odd if A mod 2 is not 0. No need to make sure it is never -1. |
| ||
I'm not sure if a number like 1.1 can even be consideerd odd or even The terms "odd" and "even" only apply to integers. That's a real neat method though sswifty. |
| ||
The abs() really isn't even neccessary to do it that way... The number is even if A mod 2 is 0, and it is odd if A mod 2 is not 0. No need to make sure it is never -1 Now you're introducing logic into programming - where's your sense of Microsoft? |
| ||
Thanks Sledge. |
| ||
AND Faster MOD slower Both work if speed isn't a factor |
| ||
I still don't understand how the AND works so i think i will us the MOD |
| ||
Hey n8r... your www.n8r2k.tk link is borken? -RZ |
| ||
n8r2k, The number (call it n) is stored in binary as a 4 byte integer in memory. Say that n = 3, it will look like this in binary: 11 That's 2 + 1 = 3. If n = 6 it will look like this: 110 That's 4 + 2 = 6. If n = 1 it will look like this: 1 1 = 1. So when you do an AND it compares each binary digit (bit), and if they are 1 in both numbers that digit is 1 in the result. If either number has a 0 for that digit, it is 0 in the result. Therefore: 011 AND 001 = 001 110 AND 001 = 000 Here's the same thing in decimal: 3 AND 1 = 1 6 AND 1 = 0 Since any even number will have a 0 for the rightmost bit, and any odd number will have 1, you will get a result of 1 for any odd number and a result of 0 for any even number. If this doesn't make sense, read up on how binary numbers work and reread :) |
| ||
Okay i understand now. Thanks RottBott. And Rook, my links shouldn't be. Try refreshing the page and if that doesnt work, you can go manually to http://dragonflame36.tripod.com/n8r2k/ . Thanks all. |
| ||
heh And I was gonna suggest something like if (2*(x%/2))=(2*(x#/2)) um............... I do like that logical stuff though. |