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