Mailing List Archive: 49091 messages

[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
```