Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] Re: bit shifts

From: greggirwin:starband at: 20-Sep-2001 6:45

Hi Hallvard, << Well, this mostly works, but wheras the integer value 1 right-shifted becomes 0, the same value divided by 2 becomes 0,5. Even if one should round the value (how do we do so in rebol, by the way?), it would become 1, not 0. So I think it's better to shift " proprement dire".
We're not dividing by 2 but by (2 ** n). Actual function definitions: shl: func [value shift-count] [to-integer (value * (2 ** shift-count))] shr: func [value shift-count] [to-integer (value / (2 ** shift-count))] I just did some quick tests and these seem to work just fine. Note that if you remove the to-integer calls, so they can go beyond 30 bit-shifts, then you can get decimal results. REBOL doesn't seem to have an integer-divide operator, so we'd have to do that ourselves. If you're only concerned about shifting too far to the right, you could do this: shr: func [value shift-count /local result] [ result: (value / (2 ** shift-count)) either result >= 1 [ return result ][ return 0 ] ] You can get bogus results by passing in a number that is not a power of 2 and shifting that (e.g. shr 25 2), so you have to decide what you want to do in that case. << Your other routines seem to work, but only partially, I'm afraid. It seems rebol has great problems with the debase function... But thanks anyway. >> Hmmm. I'll have to check it out. Thanks for letting me know. --Gregg