--- a/LargeInteger.st Fri Jun 30 18:59:32 2000 +0200
+++ b/LargeInteger.st Sun Jul 02 14:49:01 2000 +0200
@@ -1298,7 +1298,17 @@
[(index > 0) and:[(digitByteArray at:index) == 0]] whileTrue:[
index := index - 1
].
-
+"/ ((index < SmallInteger maxBytes)
+"/ or:[(index == SmallInteger maxBytes)
+"/ and:[(digitByteArray at:index) < 16r20]])
+"/ ifTrue:[
+"/ val := 0.
+"/ 1 to:index do:[:i |
+"/ val := val bitShift:8.
+"/ val := val bitOr:(digitByteArray at:i).
+"/ ].
+"/ ^ val * sign
+"/ ].
(index ~~ index0) ifTrue:[
digitByteArray := digitByteArray copyFrom:1 to:index
].
@@ -2098,14 +2108,17 @@
(could also do a primitiveFailure here)
"
ok ifFalse:[
- self primitiveFailed
+ ^ self absDivMod:(LargeInteger value:aPositiveSmallInteger).
].
^ Array with:(result compressed) with:prevRest
"
- ((16r1234 asLargeInteger absFastDiv:16rffff) at:2) printStringRadix:16
- ((16r00123456 asLargeInteger absFastDiv:16rffffff) at:2) printStringRadix:16
+ 16r123412341234 asLargeInteger absDivMod:(LargeInteger value:10)
+ ((16r1234 asLargeInteger absFastDivMod:16rffff) at:2) printStringRadix:16
+ ((16r00123456 asLargeInteger absFastDivMod:16rffffff) at:2) printStringRadix:16
+ ((666666666666666666 asLargeInteger absFastDivMod:16r3))
+ ((1666666666 asLargeInteger absFastDivMod:16r3))
"
!
@@ -4043,35 +4056,34 @@
RETURN (anyBitNonZero ? true : false);
}
%}.
- self halt:'should not happen'.
-
-"/ index := 1.
-"/ borrow := 0.
-"/
-"/ [index <= len1] whileTrue:[
-"/ diff := borrow.
-"/ diff := diff + (digitByteArray basicAt:index).
-"/ index <= len2 ifTrue:[
-"/ diff := diff - (otherDigitByteArray basicAt:index).
-"/ ].
-"/
-"/ "/ workaround for
-"/ "/ gcc code generator bug
-"/
-"/ (diff >= 0) ifTrue:[
-"/ borrow := 0
-"/ ] ifFalse:[
-"/ borrow := -1.
-"/ diff := diff + 16r100
-"/ ].
-"/ diff ~~ 0 ifTrue:[
-"/ notZero := true
-"/ ].
-"/ digitByteArray basicAt:index put:diff.
-"/ index := index + 1
-"/ ].
-"/
-"/ ^ notZero
+
+ index := 1.
+ borrow := 0.
+
+ [index <= len1] whileTrue:[
+ diff := borrow.
+ diff := diff + (digitByteArray basicAt:index).
+ index <= len2 ifTrue:[
+ diff := diff - (otherDigitByteArray basicAt:index).
+ ].
+
+ "/ workaround for
+ "/ gcc code generator bug
+
+ (diff >= 0) ifTrue:[
+ borrow := 0
+ ] ifFalse:[
+ borrow := -1.
+ diff := diff + 16r100
+ ].
+ diff ~~ 0 ifTrue:[
+ notZero := true
+ ].
+ digitByteArray basicAt:index put:diff.
+ index := index + 1
+ ].
+
+ ^ notZero
"Created: / 5.11.1996 / 16:23:47 / cg"
"Modified: / 5.11.1996 / 18:56:50 / cg"
@@ -4082,6 +4094,8 @@
"private helper for division:
destructively divide the receiver by 2."
+ |prevBit|
+
%{ /* NOCONTEXT */
OBJ __digits = __INST(digitByteArray);
@@ -4172,12 +4186,20 @@
RETURN (self);
}
%}.
- self primitiveFailed
+
+ prevBit := 0.
+ digitByteArray size to:1 by:-1 do:[:idx |
+ |thisByte|
+
+ thisByte := digitByteArray at:idx.
+ digitByteArray at:idx put:((thisByte bitShift:-1) bitOr:prevBit).
+ prevBit := (thisByte bitAnd:1) bitShift:7.
+ ].
"
100000 asLargeInteger div2
- 1000000000000000000000000000 div2
- 10000000000000000000000000000000000000000000 div2
+ 1000000000000000000000000000 div2
+ 10000000000000000000000000000000000000000000 div2
"
"Modified: 5.11.1996 / 16:12:56 / cg"
@@ -4189,7 +4211,7 @@
|nBytes "{ Class: SmallInteger }"
b "{ Class: SmallInteger }"
- t|
+ t prevBit|
nBytes := digitByteArray size.
@@ -4248,10 +4270,22 @@
RETURN (self);
}
%}.
- self primitiveFailed
+
+ prevBit := 0.
+ 1 to:digitByteArray size do:[:idx |
+ |thisByte|
+
+ thisByte := digitByteArray at:idx.
+ digitByteArray at:idx put:(((thisByte bitShift:1) bitAnd:16rFF) bitOr:prevBit).
+ prevBit := (thisByte bitShift:-7) bitAnd:1.
+ ].
"
100000 asLargeInteger mul2
+ 16r7FFFFFFFFFFF copy mul2 hexPrintString
+ 16rFFFFFFFFFFFF copy mul2 hexPrintString
+ 16r7FFFFFFFFFFFFF copy mul2 hexPrintString
+ 16rFFFFFFFFFFFFFF copy mul2 hexPrintString
10000000000000000000000000000 mul2
"
@@ -4332,5 +4366,5 @@
!LargeInteger class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.154 2000-05-10 09:40:25 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/LargeInteger.st,v 1.155 2000-07-02 12:49:01 cg Exp $'
! !