]> gitweb.factorcode.org Git - factor.git/commitdiff
math.bitwise: Add bit-range
authorDoug Coleman <doug.coleman@gmail.com>
Wed, 19 Sep 2012 21:54:36 +0000 (14:54 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 19 Sep 2012 22:44:19 +0000 (15:44 -0700)
basis/math/bitwise/bitwise-docs.factor
basis/math/bitwise/bitwise-tests.factor
basis/math/bitwise/bitwise.factor

index a771852027a82989f2308acc0c7b6458aa96d562..039fe860fcc55037097bd9fd16501c94295c50f1 100644 (file)
@@ -37,6 +37,11 @@ HELP: bits
 { $description "Keep only n bits from the integer m." }
 { $example "USING: math.bitwise prettyprint ;" "0x123abcdef 16 bits .h" "cdef" } ;
 
+HELP: bit-range
+{ $values { "x" integer } { "high" integer } { "low" integer } { "y" integer } }
+{ $description "Extract a range of bits from an integer, inclusive of each boundary." }
+{ $example "USING: math.bitwise prettyprint ;" "0b1100 3 2 bit-range .b" "11" } ;
+
 HELP: bitroll
 { $values { "x" integer } { "s" "a shift integer" } { "w" "a wrap integer" } { "y" integer }
 }
@@ -441,6 +446,11 @@ $nl
     bit?
     bit-clear?
 }
+"Extracting bits from an integer:"
+{ $subsections
+    bit-range
+    bits
+}
 "Toggling a bit:"
 { $subsections
     toggle-bit
index 0debf887a570d3740c22aebca90c4beff7ab9b03..2ad8280ed9d394626b81dffd161c712bfc47ca4e 100644 (file)
@@ -77,3 +77,5 @@ SPECIALIZED-ARRAY: uint-4
 [ t ] [ 0x0 1 bit-clear? ] unit-test
 
 [ -1 bit-count ] [ invalid-bit-count-target? ] must-fail-with
+
+{ 0b11 } [ 0b110000 5 4 bit-range ] unit-test
index 316b34d8d386b1ffdab11df85fffd2d3566a3eab..e621610d6d0b85d9fd906fc6b3d61a111d1a46c7 100644 (file)
@@ -28,6 +28,8 @@ IN: math.bitwise
 : next-even ( m -- n ) >even 2 + ; foldable
 : next-odd ( m -- n ) dup even? [ 1 + ] [ 2 + ] if ; foldable
 : shift-mod ( m s w -- n ) [ shift ] dip 2^ wrap ; inline
+: bit-range ( x high low -- y )
+    [ nip neg shift ] [ - 1 + ] 2bi bits ;
 
 : bitroll ( x s w -- y )
     [ wrap ] keep