[UPD] bitwise math functions (v1.2) -- long post
Sean Shao
shaosean at hotmail.com
Mon Nov 28 18:41:50 EST 2005
Well after a few more days of working on the bitwise math stuff I finally
have it working.. It's probably not 100% when working outside of 32-bit
numbers, but it tries.. All shifts are between 0-31 (32 is the same as 0)..
I tested against the JavaScript answers and they are identical. Thanks to
everyone on the Chatrev server for helping, testing and putting up with me
;-)
Here are the functions:
function bitwiseAnd p1, p2 -- other languages (&)
local tP1Neg, tP2Neg
if (p1 < 0) then
put bitNot abs(p1) +1 into p1
put TRUE into tP1Neg
end if
if (p2 < 0) then
put bitNot abs(p2) +1 into p2
put TRUE into tP2Neg
end if
if (tP1Neg) AND (tP2Neg) then
return 0 - bitNot ((p1 bitAnd p2) -1)
else return p1 bitAnd p2
end bitwiseAnd
function bitwiseOr p1, p2 -- other languages (|)
local tP1Neg, tP2Neg
if (p1 < 0) then
put bitNot abs(p1) +1 into p1
put TRUE into tP1Neg
end if
if (p2 < 0) then
put bitNot abs(p2) +1 into p2
put TRUE into tP2Neg
end if
if (tP1Neg) OR (tP2Neg) then
return 0 - bitNot ((p1 bitOr p2) -1)
else return p1 bitOr p2
end bitwiseOr
function bitwiseXor p1, p2 -- other languages (^)
local tP1Neg, tP2Neg
if (p1 < 0) then
put bitNot abs(p1) +1 into p1
put TRUE into tP1Neg
end if
if (p2 < 0) then
put bitNot abs(p2) +1 into p2
put TRUE into tP2Neg
end if
if (tP1Neg) AND (tP2Neg) then
return p1 bitXor p2
else if (tP1Neg) OR (tP2Neg) then
return 0 - bitNot ((p1 bitXor p2) -1)
else return p1 bitXor p2
end bitwiseXor
function bitwiseNot p1 -- other languages (~)
return 0 - (p1 + 1)
end bitwiseNot
function bitwiseShiftLeft p1, p2 -- other languages (<<)
local tP1Neg
put (abs(p2) MOD 32) into p2
if (p2 = 0) then return p1 -- no shifting
if (p1 < 0) then put TRUE into tP1Neg
put baseConvert(abs(p1), 10, 2) into p1
repeat p2
put 0 after p1
end repeat
if (tP1Neg) then
if (baseConvert(p1, 2, 10) > 2147483648) then return 2147483648 -
(baseConvert(p1, 2, 10) MOD 2147483648)
else return 0 - baseConvert(p1, 2, 10)
else
if (baseConvert(p1, 2, 10) >= 2147483648) then return 0 - (2147483648 -
baseConvert(char -31 to -1 of p1, 2, 10))
else return baseConvert(p1, 2, 10)
end if
end bitwiseShiftLeft
function bitwiseShiftRight p1, p2 -- other languages (>>) and (>>>)
# There is a third optional parameter which will force left-pad the binary
number with 0's
# This in effect switches negative numbers into positive
# bitwiseShiftRight(13, 4) -- other languages (>>)
# bitwiseShiftRight(13, 4, TRUE) -- other languages (>>>)
local tP1Neg, tPad, tZeroFill
put (abs(p2) MOD 32) into p2
if (paramCount() = 3) then put TRUE into tZeroFill
if (p1 = 0) then return p1
if (p1 > 0) then
if (p2 = 0) then return p1 -- no shifting
put baseConvert(abs(p1), 10, 2) into p1
repeat p2
delete char -1 of p1
if (tZeroFill) then put 0 before p1
end repeat
return baseConvert(p1, 2, 10)
end if
if (p1 < 0) then
if (tZeroFill) then
put baseConvert(bitNot abs(p1) +1, 10, 2) into p1
repeat p2
delete char -1 of p1
put 0 before p1
end repeat
put abs(baseConvert(p1, 2, 10)) into p1
if (p1 = 0) then return 0
else return p1
else
if (p2 = 0) then return p1 -- no shifting
put abs(p1) / (2 ^ p2) into p1
if (p1 is an integer) then return 0 - p1
return 0 - trunc(p1) - 1
end if
end if
end bitwiseShiftRight
function bitwiseRotateLeft p1, p2
local tSL, tSR
put bitwiseShiftLeft(p1, p2) into tSL
put bitwiseShiftRight(p1, abs(p2)) into tSR
return bitwiseOr(tSL, tSR)
end bitwiseRotateLeft
function bitwiseRotateRight p1, p2
local tSR, tSL
put bitwiseShiftRight(p1, p2) into tSR
put bitwiseShiftLeft(p1, 32-p2) into tSL
return bitwiseOR(tSR, tSL)
end bitwiseRotateRight
--
-Sean <www.shaosean.tk>
1f u c4n r34d th15 u n33d 2 g3t l41d
_________________________________________________________________
Dont just search. Find. Check out the new MSN Search!
http://search.msn.click-url.com/go/onm00200636ave/direct/01/
More information about the use-livecode
mailing list