core: Add logand, lognot.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 Aug 2017 10:53:01 +0000 (12:53 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 Aug 2017 10:53:01 +0000 (12:53 +0200)
* src/math.c (logand, lognot): New function.

src/math.c

index c0b6190b434375fb23d4985f83509414afe00c51..1e9df4dac5119498e21bfdee95c5446a56dcaac3 100644 (file)
@@ -135,6 +135,19 @@ multiply (SCM x) ///((name . "*") (arity . n))
   return MAKE_NUMBER (n);
 }
 
+SCM
+logand (SCM x) ///((arity . n))
+{
+  int n = 0;
+  while (x != cell_nil)
+    {
+      assert (TYPE (car (x)) == TNUMBER);
+      n &= VALUE (car (x));
+      x = cdr (x);
+    }
+  return MAKE_NUMBER (n);
+}
+
 SCM
 logior (SCM x) ///((arity . n))
 {
@@ -148,6 +161,14 @@ logior (SCM x) ///((arity . n))
   return MAKE_NUMBER (n);
 }
 
+SCM
+lognot (SCM x)
+{
+  assert (TYPE (x) == TNUMBER);
+  int n = ~VALUE (x);
+  return MAKE_NUMBER (n);
+}
+
 SCM
 ash (SCM n, SCM count)
 {