Add more unit-tests and docs for math.bitwise. Fix a bug with >signed so that it truncates a number to however many bits you tell it the number is before doing the calculation.
parent
c96289ef62
commit
eedc1e185f
|
@ -154,6 +154,45 @@ HELP: symbols>flags
|
|||
}
|
||||
} ;
|
||||
|
||||
HELP: >even
|
||||
{ $values
|
||||
{ "m" integer }
|
||||
{ "n" integer }
|
||||
}
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise prettyprint ;"
|
||||
"7 >even ."
|
||||
"6"
|
||||
}
|
||||
}
|
||||
{ $description "Sets the lowest bit in the integer to 0, which either does nothing or outputs 1 less than the input integer." } ;
|
||||
|
||||
HELP: >odd
|
||||
{ $values
|
||||
{ "m" integer }
|
||||
{ "n" integer }
|
||||
}
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise prettyprint ;"
|
||||
"4 >odd ."
|
||||
"5"
|
||||
}
|
||||
}
|
||||
{ $description "Sets the lowest bit in the integer to 1, which either does nothing or outputs 1 more than the input integer." } ;
|
||||
|
||||
HELP: >signed
|
||||
{ $values
|
||||
{ "x" integer } { "n" integer }
|
||||
{ "y" integer }
|
||||
}
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise prettyprint ;"
|
||||
"HEX: ff 8 >signed ."
|
||||
"-1"
|
||||
}
|
||||
}
|
||||
{ $description "Interprets a number " { $snippet "x" } " as an " { $snippet "n" } "-bit number and converts it to a negative number " { $snippet "n" } "-bit number if the topmost bit is set." } ;
|
||||
|
||||
HELP: mask
|
||||
{ $values
|
||||
{ "x" integer } { "n" integer }
|
||||
|
@ -298,7 +337,7 @@ HELP: w*
|
|||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Multiplies two integers and wraps the result to 32 bits." }
|
||||
{ $description "Multiplies two integers and wraps the result to a 32-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: ffffffff HEX: 2 w* ."
|
||||
|
@ -311,7 +350,7 @@ HELP: w+
|
|||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Adds two integers and wraps the result to 32 bits." }
|
||||
{ $description "Adds two integers and wraps the result to a 32-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: ffffffff HEX: 2 w+ ."
|
||||
|
@ -324,7 +363,7 @@ HELP: w-
|
|||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Subtracts two integers and wraps the result to 32 bits." }
|
||||
{ $description "Subtracts two integers and wraps the result to a 32-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: 0 HEX: ff w- ."
|
||||
|
@ -332,6 +371,45 @@ HELP: w-
|
|||
}
|
||||
} ;
|
||||
|
||||
HELP: W*
|
||||
{ $values
|
||||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Multiplies two integers and wraps the result to a 64-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: ffffffffffffffff HEX: 2 W* ."
|
||||
"18446744073709551614"
|
||||
}
|
||||
} ;
|
||||
|
||||
HELP: W+
|
||||
{ $values
|
||||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Adds two integers and wraps the result to 64-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: ffffffffffffffff HEX: 2 W+ ."
|
||||
"1"
|
||||
}
|
||||
} ;
|
||||
|
||||
HELP: W-
|
||||
{ $values
|
||||
{ "x" integer } { "y" integer }
|
||||
{ "z" integer }
|
||||
}
|
||||
{ $description "Subtracts two integers and wraps the result to a 64-bit unsigned integer." }
|
||||
{ $examples
|
||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||
"HEX: 0 HEX: ff W- ."
|
||||
"18446744073709551361"
|
||||
}
|
||||
} ;
|
||||
|
||||
HELP: wrap
|
||||
{ $values
|
||||
{ "m" integer } { "n" integer }
|
||||
|
@ -394,6 +472,17 @@ $nl
|
|||
w-
|
||||
w*
|
||||
}
|
||||
"64-bit arithmetic:"
|
||||
{ $subsections
|
||||
W+
|
||||
W-
|
||||
W*
|
||||
}
|
||||
"Converting a number to the nearest even/odd:"
|
||||
{ $subsections
|
||||
>even
|
||||
>odd
|
||||
}
|
||||
"Bitfields:"
|
||||
{ $subsections
|
||||
"math-bitfields"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
USING: accessors math math.bitwise tools.test kernel words
|
||||
specialized-arrays alien.c-types math.vectors.simd
|
||||
sequences destructors libc literals ;
|
||||
sequences destructors libc literals classes.struct ;
|
||||
SPECIALIZED-ARRAY: int
|
||||
IN: math.bitwise.tests
|
||||
|
||||
|
@ -29,6 +29,13 @@ IN: math.bitwise.tests
|
|||
[ 4 ] [ BIN: 1010101 bit-count ] unit-test
|
||||
[ 0 ] [ BIN: 0 bit-count ] unit-test
|
||||
[ 1 ] [ BIN: 1 bit-count ] unit-test
|
||||
[ 2 ] [ B{ 1 1 } bit-count ] unit-test
|
||||
[ 64 ] [ HEX: ffffffffffffffff bit-count ] unit-test
|
||||
|
||||
STRUCT: bit-count-struct { a uint } ;
|
||||
|
||||
[ 2 ] [ S{ bit-count-struct { a 3 } } bit-count ] unit-test
|
||||
|
||||
|
||||
SPECIALIZED-ARRAY: uint
|
||||
SPECIALIZED-ARRAY: uint-4
|
||||
|
@ -48,3 +55,25 @@ SPECIALIZED-ARRAY: uint-4
|
|||
[ f ] [ BIN: 1 even-parity? ] unit-test
|
||||
[ f ] [ BIN: 0 odd-parity? ] unit-test
|
||||
[ t ] [ BIN: 1 odd-parity? ] unit-test
|
||||
|
||||
[ -1 ] [ HEX: ff 4 >signed ] unit-test
|
||||
[ -1 ] [ HEX: ff 8 >signed ] unit-test
|
||||
[ 255 ] [ HEX: ff 16 >signed ] unit-test
|
||||
|
||||
[ 2 ] [ 3 >even ] unit-test
|
||||
[ 3 ] [ 3 >odd ] unit-test
|
||||
[ 5 ] [ 4 >odd ] unit-test
|
||||
|
||||
[ t ] [ HEX: ff 1 mask? ] unit-test
|
||||
[ f ] [ HEX: 0 1 mask? ] unit-test
|
||||
|
||||
[ 7 ] [ 5 next-odd ] unit-test
|
||||
[ 7 ] [ 6 next-odd ] unit-test
|
||||
|
||||
[ 6 ] [ 5 next-even ] unit-test
|
||||
[ 8 ] [ 6 next-even ] unit-test
|
||||
|
||||
[ f ] [ HEX: 1 0 bit-clear? ] unit-test
|
||||
[ t ] [ HEX: 0 1 bit-clear? ] unit-test
|
||||
|
||||
[ -1 bit-count ] [ invalid-bit-count-target? ] must-fail-with
|
||||
|
|
|
@ -19,7 +19,8 @@ IN: math.bitwise
|
|||
: mask-bit ( m n -- m' ) 2^ mask ; inline
|
||||
: on-bits ( m -- n ) 2^ 1 - ; inline
|
||||
: toggle-bit ( m n -- m' ) 2^ bitxor ; inline
|
||||
: >signed ( x n -- y ) 2dup neg 1 + shift 1 = [ 2^ - ] [ drop ] if ;
|
||||
: >signed ( x n -- y )
|
||||
[ bits ] keep 2dup neg 1 + shift 1 = [ 2^ - ] [ drop ] if ;
|
||||
: >odd ( m -- n ) 0 set-bit ; foldable
|
||||
: >even ( m -- n ) 0 clear-bit ; foldable
|
||||
: next-even ( m -- n ) >even 2 + ; foldable
|
||||
|
|
Loading…
Reference in New Issue