53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (c) 2012 Anonymous
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: arrays kernel locals math math.parser math.ranges
 | |
| prettyprint sequences ;
 | |
| IN: rosetta-code.gray-code
 | |
| 
 | |
| ! http://rosettacode.org/wiki/Gray_code
 | |
| 
 | |
| ! Gray code is a form of binary encoding where transitions
 | |
| ! between consecutive numbers differ by only one bit. This is a
 | |
| ! useful encoding for reducing hardware data hazards with values
 | |
| ! that change rapidly and/or connect to slower hardware as inputs.
 | |
| ! It is also useful for generating inputs for Karnaugh maps in
 | |
| ! order from left to right or top to bottom.
 | |
| 
 | |
| ! Create functions to encode a number to and decode a number
 | |
| ! from Gray code. Display the normal binary representations, Gray
 | |
| ! code representations, and decoded Gray code values for all 5-bit
 | |
| ! binary numbers (0-31 inclusive, leading 0's not necessary).
 | |
| 
 | |
| ! There are many possible Gray codes. The following encodes what
 | |
| ! is called "binary reflected Gray code."
 | |
| 
 | |
| ! Encoding (MSB is bit 0, b is binary, g is Gray code):
 | |
| !   if b[i-1] = 1
 | |
| !      g[i] = not b[i]
 | |
| !   else
 | |
| !      g[i] = b[i]
 | |
| 
 | |
| ! Or:
 | |
| !   g = b xor (b logically right shifted 1 time)
 | |
| 
 | |
| ! Decoding (MSB is bit 0, b is binary, g is Gray code):
 | |
| !   b[0] = g[0]
 | |
| !   b[i] = g[i] xor b[i-1]
 | |
| 
 | |
| : gray-encode ( n -- n' ) dup -1 shift bitxor ;
 | |
| 
 | |
| :: gray-decode ( n! -- n' )
 | |
|     n :> p!
 | |
|     [ n -1 shift dup n! 0 = not ] [
 | |
|         p n bitxor p!
 | |
|     ] while
 | |
|     p ;
 | |
| 
 | |
| : gray-code-main ( -- )
 | |
|     -1 32 [a,b] [
 | |
|         dup [ >bin ] [ gray-encode ] bi
 | |
|         [ >bin ] [ gray-decode ] bi 4array .
 | |
|     ] each ;
 | |
| 
 | |
| MAIN: gray-code-main
 |