diff options
Diffstat (limited to 'logical.scm')
-rw-r--r-- | logical.scm | 22 |
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) |