summaryrefslogtreecommitdiffstats
path: root/logical.scm
diff options
context:
space:
mode:
Diffstat (limited to 'logical.scm')
-rw-r--r--logical.scm22
1 files changed, 20 insertions, 2 deletions
diff --git a/logical.scm b/logical.scm
index 1cc0726..c85507d 100644
--- a/logical.scm
+++ b/logical.scm
@@ -67,10 +67,25 @@
(define (logical:logbit? index int)
(logical:logtest (logical:integer-expt 2 index) int))
-(define (logical:bit-extract n start end)
+(define (logical:copy-bit index to bool)
+ (if bool
+ (logical:logior to (logical:ash 1 index))
+ (logical:logand to (logical:lognot (logical:ash 1 index)))))
+
+(define (logical:bit-field n start end)
(logical:logand (- (logical:integer-expt 2 (- end start)) 1)
(logical:ash n (- start))))
+(define (logical:bitwise-if mask n0 n1)
+ (logical:logior (logical:logand mask n0)
+ (logical:logand (logical:lognot mask) n1)))
+
+(define (logical:copy-bit-field to start end from)
+ (logical:bitwise-if
+ (logical:ash (- (logical:integer-expt 2 (- end start)) 1) start)
+ (logical:ash from start)
+ to))
+
(define (logical:ash int cnt)
(if (negative? cnt)
(let ((n (logical:integer-expt 2 (- cnt))))
@@ -142,9 +157,12 @@
(define lognot logical:lognot)
(define logtest logical:logtest)
(define logbit? logical:logbit?)
+(define copy-bit logical:copy-bit)
(define ash logical:ash)
(define logcount logical:logcount)
(define integer-length logical:integer-length)
-(define bit-extract logical:bit-extract)
+(define bit-field logical:bit-field)
+(define bit-extract logical:bit-field)
+(define copy-bit-field logical:copy-bit-field)
(define ipow-by-squaring logical:ipow-by-squaring)
(define integer-expt logical:integer-expt)