|
|
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.