2016-12-05 22:15:40 +01:00
|
|
|
: >gray ( n -- n' ) dup 2/ xor ; \ n' = n xor (n logically right shifted 1 time)
|
|
|
|
|
\ 2/ is Forth divide by 2, ie: shift right 1
|
2013-04-10 21:29:02 -07:00
|
|
|
: gray> ( n -- n )
|
2016-12-05 22:15:40 +01:00
|
|
|
0 1 31 lshift ( -- g b mask )
|
2013-04-10 21:29:02 -07:00
|
|
|
begin
|
2016-12-05 22:15:40 +01:00
|
|
|
>r \ save a copy of mask on return stack
|
2013-04-10 21:29:02 -07:00
|
|
|
2dup 2/ xor
|
|
|
|
|
r@ and or
|
2016-12-05 22:15:40 +01:00
|
|
|
r> 1 rshift
|
|
|
|
|
dup 0=
|
2013-04-10 21:29:02 -07:00
|
|
|
until
|
2016-12-05 22:15:40 +01:00
|
|
|
drop nip ; \ clean the parameter stack leaving result only
|
2013-04-10 21:29:02 -07:00
|
|
|
|
|
|
|
|
: test
|
2016-12-05 22:15:40 +01:00
|
|
|
2 base ! \ set system number base to 2. ie: Binary
|
2013-04-10 21:29:02 -07:00
|
|
|
32 0 do
|
2016-12-05 22:15:40 +01:00
|
|
|
cr I dup 5 .r ." ==> " \ print numbers (binary) right justified 5 places
|
2013-04-10 21:29:02 -07:00
|
|
|
>gray dup 5 .r ." ==> "
|
|
|
|
|
gray> 5 .r
|
|
|
|
|
loop
|
2016-12-05 22:15:40 +01:00
|
|
|
decimal ; \ revert to BASE 10
|