--- 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 $'
! !