diff scripts/general/bitget.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 a0e7231a58eb
line wrap: on
line diff
--- a/scripts/general/bitget.m
+++ b/scripts/general/bitget.m
@@ -34,21 +34,43 @@
     usage ("bitget (A, n)");
   endif
 
-  cname = class (A);
-  if (strcmp (cname, "double"))
-    Amax = log2 (bitmax) + 1;
-  elseif strcmp ("uint", substr (cname, 1, 4))
-    Amax = eval ([cname, " (log2 (double (intmax (cname))) + 1);"]);
+  if (isa (A, "double"))
+    Amax = log2 (Bmax) + 1;
+    _conv = @double;
   else
-    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
   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
 
-  X = eval (["bitand (A, ", cname, " (2) .^ (", cname, " (n) - Aone)) != ", cname, "(0);"]);
-
+  X = bitand (A, bitshift (_conv (1), uint8 (n) - uint8 (1))) != _conv (0);
 endfunction