1;; bitwise library
2;; compile before use
3
4
5(defun logand (x y)
6    (c-lang "res = INT_FLAG | ((INT_MASK & X) & (INT_MASK & Y));"))
7
8(defun logior (x y)
9    (c-lang "res = INT_FLAG | ((INT_MASK & X) | (INT_MASK & Y));"))
10
11(defun logxor (x y)
12    (c-lang "res = INT_FLAG | ((INT_MASK & X) ^ (INT_MASK & Y));"))
13
14(defun lognot (x)
15    (c-lang "res = INT_FLAG | ~(INT_MASK & X);"))
16
17(defun logtest (x y)
18    (c-lang "int z; z = ((INT_MASK & X) & (INT_MASK & Y));")
19    (c-lang "if(z==0) res=NIL; else res = T;"))
20
21;;bit test
22(defun logbitp (n m)
23  (if (>= n 0)
24      (c-lang "int x; x = (INT_MASK & M) << (INT_MASK & N);
25               if(x % 2 == 1) res = T; else res = NIL;")
26      (error "logbitp: not positive" n)))
27
28(defun logcount (n)
29    (if (>= n 0)
30        (c-lang "int x,i; x = (INT_MASK & N); i = 0;
31                 while(x != 0){
32                    if(x % 2 == 1) i++;
33                    x = x >> 1;
34                 }
35                 res = INT_FLAG | i;")
36        (c-lang "int x,i; x = (INT_MASK & N); i = 0;
37                 while(x != 0){
38                    if(x % 2 == 0) i++;
39                    x = x >> 1;
40                 }
41                 res = INT_FLAG | i;")))
42
43;;bit shift
44(defun ash (n m)
45  (if (>= m 0)
46      (c-lang "res = INT_FLAG | ((INT_MASK & N) << (INT_MASK & M));")
47      (if (>= n 0)
48          (let ((m1 (- m)))
49            (c-lang "res = INT_FLAG | ((INT_MASK & N) >> (INT_MASK & M1));"))
50          (let ((m1 (- m)))
51            (c-lang "res = INT_FLAG | (N >> (INT_MASK & M1));")))))
52
53