|
|
1.1 ! root 1: # BITOPS(2) ! 2: # ! 3: # Logical operations on strings of 0s and 1s ! 4: # ! 5: # Ralph E. Griswold ! 6: # ! 7: # Last modified 4/27/83 ! 8: # ! 9: # ! 10: ! 11: # convert integer i to bit string ! 12: # ! 13: procedure bitstring(i) ! 14: local b, h ! 15: if i < 0 then { ! 16: h := 1 ! 17: i := -(i + 1) ! 18: } ! 19: else h := 0 ! 20: b := "" ! 21: while i ~= 0 do { ! 22: b := abs(i % 2) || b ! 23: i /:= 2 ! 24: } ! 25: b := right(b,32,"0") ! 26: if h = 1 then b := neg(b) ! 27: return b ! 28: end ! 29: ! 30: # logical "and" of b1 and b2 ! 31: # ! 32: procedure and(b1,b2) ! 33: return map(bsum(b1,b2),"12","01") ! 34: end ! 35: ! 36: ! 37: # arithmetic sum of b1 and b2 (used by other procedures) ! 38: # ! 39: procedure bsum(b1,b2) ! 40: static segment ! 41: initial segment := 10 ! 42: if *b1 > *b2 then b1 :=: b2 ! 43: b1 := right(b1,*b2,"0") ! 44: if *b1 <= segment then return b1 + b2 ! 45: return b1[1+:segment] + b2[1+:segment] || ! 46: bsum(b1[segment + 1:0],b2[segment + 1:0]) ! 47: end ! 48: ! 49: # convert bitstring b to integer ! 50: # ! 51: procedure decimal(b) ! 52: return integer("2r" || b) ! 53: end ! 54: ! 55: # exclusive "or" of b1 and b2 ! 56: # ! 57: procedure exor(b1,b2) ! 58: return map(bsum(b1,b2),"2","0") ! 59: end ! 60: ! 61: # negation (complement) of b ! 62: # ! 63: procedure neg(b) ! 64: return map(b,"01","10") ! 65: end ! 66: ! 67: # logical "or" of b1 and b2 ! 68: # ! 69: procedure or(b1,b2) ! 70: return map(bsum(b1,b2),"2","1") ! 71: end ! 72: ! 73: procedure xstop(x) ! 74: stop("Run-time error 205 in bitstring_ ! 75: \nvalue out of range\noffending value: ", ! 76: image(x)) ! 77: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.