diff -r 29a3a26970e8 -r 3981835eca68 LargeInteger.st --- a/LargeInteger.st Wed Jan 20 04:19:23 2016 +0100 +++ b/LargeInteger.st Wed Jan 20 04:19:30 2016 +0100 @@ -1,5 +1,3 @@ -"{ Encoding: utf8 }" - " COPYRIGHT (c) 1994 by Claus Gittinger All Rights Reserved @@ -316,8 +314,6 @@ "Modified: / 8.5.1998 / 21:40:41 / cg" ! ! - - !LargeInteger class methodsFor:'queries'! isBuiltInClass @@ -1111,50 +1107,6 @@ "Modified: / 26.9.2001 / 17:34:03 / cg" ! -bitAt:anIntegerIndex - "return the value of the index's bit (index starts at 1) as 0 or 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 = __byteArraySize(__INST(digitByteArray)); - - if (digitLen < byteOffset) { - RETURN(__mkSmallInteger(0)); - } - - v1 = (__byteArrayVal(__INST(digitByteArray)))[byteOffset]; - if (v1 & (1 << (idx % 8))) { - RETURN(__mkSmallInteger(1)); - } else { - RETURN(__mkSmallInteger(0)); - } - } - } -%}. - ^ super bitAt:anIntegerIndex - - " - TestCase should:[ 16rFFFFFFFFFF01 bitAt:0 ] raise:Error - TestCase assert:( 16rFFFFFFFFFF01 bitAt:49 ) == 0 - TestCase assert:( 16rFFFFFFFFFF01 bitAt:1 ) == 1 - TestCase assert:( 16rFFFFFFFFFF01 bitAt:2 ) == 0 - TestCase assert:( 16rFFFFFFFFFF02 bitAt:2 ) == 1 - TestCase assert:( 16rFFFFFFFF01FF bitAt:8 ) == 1 - TestCase assert:( 16rFFFFFFFF01FF bitAt:9 ) == 1 - TestCase assert:( 16rFFFFFFFF01FF bitAt:10 ) == 0 - " - - "Modified: / 10-08-2010 / 12:33:04 / cg" -! - bitXor:anInteger "return the bitwise-or of the receiver and the argument, anInteger. Here, a specially tuned version for largeInteger arguments @@ -1336,6 +1288,52 @@ " "Modified: 14.8.1997 / 11:55:34 / cg" +! ! + +!LargeInteger methodsFor:'bit operators - indexed'! + +bitAt:anIntegerIndex + "return the value of the index's bit (index starts at 1) as 0 or 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 = __byteArraySize(__INST(digitByteArray)); + + if (digitLen < byteOffset) { + RETURN(__mkSmallInteger(0)); + } + + v1 = (__byteArrayVal(__INST(digitByteArray)))[byteOffset]; + if (v1 & (1 << (idx % 8))) { + RETURN(__mkSmallInteger(1)); + } else { + RETURN(__mkSmallInteger(0)); + } + } + } +%}. + ^ super bitAt:anIntegerIndex + + " + TestCase should:[ 16rFFFFFFFFFF01 bitAt:0 ] raise:Error + TestCase assert:( 16rFFFFFFFFFF01 bitAt:49 ) == 0 + TestCase assert:( 16rFFFFFFFFFF01 bitAt:1 ) == 1 + TestCase assert:( 16rFFFFFFFFFF01 bitAt:2 ) == 0 + TestCase assert:( 16rFFFFFFFFFF02 bitAt:2 ) == 1 + TestCase assert:( 16rFFFFFFFF01FF bitAt:8 ) == 1 + TestCase assert:( 16rFFFFFFFF01FF bitAt:9 ) == 1 + TestCase assert:( 16rFFFFFFFF01FF bitAt:10 ) == 0 + " + + "Modified: / 10-08-2010 / 12:33:04 / cg" ! setBit:index