LargeInteger.st
changeset 8334 4466f66d1f9a
parent 7544 dcde4788d7f0
child 8628 38dc3601e16b
--- a/LargeInteger.st	Fri Apr 23 18:11:23 2004 +0200
+++ b/LargeInteger.st	Tue Apr 27 14:29:44 2004 +0200
@@ -913,6 +913,48 @@
     "Modified: / 26.9.2001 / 17:34:03 / cg"
 !
 
+bitAt:anIntegerIndex
+    "return the value of the index's bit (index starts at 1).
+     Notice: the result of bitAt: on negative receivers is not 
+             defined in the language standard (since the implementation
+             is free to choose any internal representation for integers)"
+
+%{  /* NOCONTEXT */
+
+    if (__isSmallInteger(anIntegerIndex)) {
+        INT idx = __smallIntegerVal(anIntegerIndex) - 1;
+        if (idx >= 0) {
+            int v1;
+            int byteOffset = idx / 8;
+            int digitLen   = __stringSize(__INST(digitByteArray));
+
+            if (digitLen < byteOffset) {
+                RETURN(__mkSmallInteger(0));
+            }
+        
+            v1 = ((unsigned char *)(__stringVal(__INST(digitByteArray))))[byteOffset];
+            if (v1 & (1 << (idx % 8))) {
+                RETURN(__mkSmallInteger(1));
+            } else {
+                RETURN(__mkSmallInteger(0));
+            }
+        }
+    }
+%}.
+    ^ super bitAt:anIntegerIndex
+
+    "
+     16rFFFFFFFFFF01 bitAt:0 
+     16rFFFFFFFFFF01 bitAt:49 
+     16rFFFFFFFFFF01 bitAt:1 
+     16rFFFFFFFFFF01 bitAt:2 
+     16rFFFFFFFFFF02 bitAt:2 
+     16rFFFFFFFF01FF bitAt:8 
+     16rFFFFFFFF01FF bitAt:9 
+     16rFFFFFFFF01FF bitAt:10 
+    "
+!
+
 bitXor:anInteger
     "return the bitwise-or of the receiver and the argument, anInteger.
      Here, a specially tuned version for largeInteger arguments 
@@ -4469,5 +4511,5 @@
 !LargeInteger class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.176 2003-08-12 20:56:24 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.177 2004-04-27 12:29:44 stefan Exp $'
 ! !