diff scripts/general/bitset.m @ 4950:0896307b1b48

[project @ 2004-08-31 21:26:35 by jwe]
author jwe
date Tue, 31 Aug 2004 21:26:35 +0000
parents b22a7a1db0d5
children c08cb1098afc
line wrap: on
line diff
--- a/scripts/general/bitset.m
+++ b/scripts/general/bitset.m
@@ -41,29 +41,51 @@
     value = 1;
   endif
   
-  cname = class (A);
-  if (strcmp (cname, "double"))
+  if (isa (A, "double"))
     Bmax = bitmax;
     Amax = log2 (Bmax) + 1;
-  elseif strcmp("uint", substr (cname, 1, 4))
-    Bmax = intmax (cname);
-    Amax = eval ([cname, " (log2 (double (intmax (cname))) + 1);"]);
+    _conv = @double;
   else
-    Bmax = eval ([cname, " (-1);"]);
-    Amax = eval ([cname, " (log2 (double (intmax (cname))) + 2);"]);
+    if (isa (A, "uint8"))
+      Amax = 8;
+      _conv = @uint8;
+    elseif (isa (A, "uint16"))
+      Amax = 16;
+      _conv = @uint16;
+    elseif (isa (A, "uint32"))
+      Amax = 32;
+      _conv = @uint32;
+    elseif (isa (A, "uint64"))
+      Amax = 64;
+      _conv = @uint64;
+    elseif (isa (A, "int8"))
+      Amax = 8;
+      _conv = @int8;
+    elseif (isa (A, "int16"))
+      Amax = 16;
+      _conv = @int16;
+    elseif (isa (A, "int32"))
+      Amax = 32;
+      _conv = @int32;
+    elseif (isa (A, "int64"))
+      Amax = 64;
+      _conv = @int64;
+    else
+      error ("invalid class %s", class (A));
+    endif
+    Bmax = intmax (class (A));
   endif
 
-  Aone = eval ([ cname, "(1);"]);
-  m = eval ([cname, " (n(:));"]);
-  if (any (m < Aone) || any (m > Amax))
+  m = double (n(:));
+  if (any (m < 1) || any (m > Amax))
     error ("n must be in the range [1,%d]", Amax);
   endif
 
-  ## XXX FIXME XXX Need extra cast to cname due to bad return value of .^
-  X = eval (["bitand (A, Bmax - ", cname, " (", cname, " (2) .^ (", cname, " (n) - Aone)));"]);
+  mask = bitshift (_conv (1), uint8 (n) - uint8 (1));
+  X = bitxor (A, bitand (A, mask));
 
   if (value)
-    X = eval (["bitor (A, ", cname, " (2) .^ (", cname, " (n) - Aone));"]);
+    X = bitor (A, mask);
   endif
 
 endfunction