diff -r 9b32f94426ca -r 4466f66d1f9a LargeInteger.st --- 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 $' ! !