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
|
HELP: mask
|
||||||
{ $values
|
{ $values
|
||||||
{ "x" integer } { "n" integer }
|
{ "x" integer } { "n" integer }
|
||||||
|
@ -298,7 +337,7 @@ HELP: w*
|
||||||
{ "x" integer } { "y" integer }
|
{ "x" integer } { "y" integer }
|
||||||
{ "z" 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
|
{ $examples
|
||||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||||
"HEX: ffffffff HEX: 2 w* ."
|
"HEX: ffffffff HEX: 2 w* ."
|
||||||
|
@ -311,7 +350,7 @@ HELP: w+
|
||||||
{ "x" integer } { "y" integer }
|
{ "x" integer } { "y" integer }
|
||||||
{ "z" 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
|
{ $examples
|
||||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||||
"HEX: ffffffff HEX: 2 w+ ."
|
"HEX: ffffffff HEX: 2 w+ ."
|
||||||
|
@ -324,7 +363,7 @@ HELP: w-
|
||||||
{ "x" integer } { "y" integer }
|
{ "x" integer } { "y" integer }
|
||||||
{ "z" 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
|
{ $examples
|
||||||
{ $example "USING: math.bitwise kernel prettyprint ;"
|
{ $example "USING: math.bitwise kernel prettyprint ;"
|
||||||
"HEX: 0 HEX: ff w- ."
|
"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
|
HELP: wrap
|
||||||
{ $values
|
{ $values
|
||||||
{ "m" integer } { "n" integer }
|
{ "m" integer } { "n" integer }
|
||||||
|
@ -394,6 +472,17 @@ $nl
|
||||||
w-
|
w-
|
||||||
w*
|
w*
|
||||||
}
|
}
|
||||||
|
"64-bit arithmetic:"
|
||||||
|
{ $subsections
|
||||||
|
W+
|
||||||
|
W-
|
||||||
|
W*
|
||||||
|
}
|
||||||
|
"Converting a number to the nearest even/odd:"
|
||||||
|
{ $subsections
|
||||||
|
>even
|
||||||
|
>odd
|
||||||
|
}
|
||||||
"Bitfields:"
|
"Bitfields:"
|
||||||
{ $subsections
|
{ $subsections
|
||||||
"math-bitfields"
|
"math-bitfields"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
USING: accessors math math.bitwise tools.test kernel words
|
USING: accessors math math.bitwise tools.test kernel words
|
||||||
specialized-arrays alien.c-types math.vectors.simd
|
specialized-arrays alien.c-types math.vectors.simd
|
||||||
sequences destructors libc literals ;
|
sequences destructors libc literals classes.struct ;
|
||||||
SPECIALIZED-ARRAY: int
|
SPECIALIZED-ARRAY: int
|
||||||
IN: math.bitwise.tests
|
IN: math.bitwise.tests
|
||||||
|
|
||||||
|
@ -29,6 +29,13 @@ IN: math.bitwise.tests
|
||||||
[ 4 ] [ BIN: 1010101 bit-count ] unit-test
|
[ 4 ] [ BIN: 1010101 bit-count ] unit-test
|
||||||
[ 0 ] [ BIN: 0 bit-count ] unit-test
|
[ 0 ] [ BIN: 0 bit-count ] unit-test
|
||||||
[ 1 ] [ BIN: 1 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
|
||||||
SPECIALIZED-ARRAY: uint-4
|
SPECIALIZED-ARRAY: uint-4
|
||||||
|
@ -48,3 +55,25 @@ SPECIALIZED-ARRAY: uint-4
|
||||||
[ f ] [ BIN: 1 even-parity? ] unit-test
|
[ f ] [ BIN: 1 even-parity? ] unit-test
|
||||||
[ f ] [ BIN: 0 odd-parity? ] unit-test
|
[ f ] [ BIN: 0 odd-parity? ] unit-test
|
||||||
[ t ] [ BIN: 1 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
|
: mask-bit ( m n -- m' ) 2^ mask ; inline
|
||||||
: on-bits ( m -- n ) 2^ 1 - ; inline
|
: on-bits ( m -- n ) 2^ 1 - ; inline
|
||||||
: toggle-bit ( m n -- m' ) 2^ bitxor ; 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
|
: >odd ( m -- n ) 0 set-bit ; foldable
|
||||||
: >even ( m -- n ) 0 clear-bit ; foldable
|
: >even ( m -- n ) 0 clear-bit ; foldable
|
||||||
: next-even ( m -- n ) >even 2 + ; foldable
|
: next-even ( m -- n ) >even 2 + ; foldable
|
||||||
|
|
Loading…
Reference in New Issue