--- a/Integer.st Tue Nov 05 12:21:22 1996 +0100
+++ b/Integer.st Tue Nov 05 14:32:24 1996 +0100
@@ -306,11 +306,11 @@
result := self class basicNew numberOfDigits:n.
1 to:n do:[:index |
- byte := (anInteger digitAt:index) bitAnd:(self digitAt:index).
- result digitAt:index put:byte.
+ byte := (anInteger digitAt:index) bitAnd:(self digitAt:index).
+ result digitAt:index put:byte.
].
(byte == 0 or:[n < 5]) ifTrue:[
- ^ result normalize
+ ^ result compressed
].
^ result
@@ -320,6 +320,8 @@
(16r112233445566778899 bitAnd:16rFF0000000000000000) printStringRadix:16
(16r112233445566778899 bitAnd:16r00000000000000FFFF) printStringRadix:16
"
+
+ "Modified: 5.11.1996 / 14:06:26 / cg"
!
bitAt:index
@@ -386,8 +388,8 @@
leftShift if shiftCount > 0; rightShift otherwise.
Notice: the result of bitShift: on negative receivers is not
- defined in the language standard (since the implementation
- is free to choose any internal representation for integers)"
+ defined in the language standard (since the implementation
+ is free to choose any internal representation for integers)"
|result
prev "{ Class: SmallInteger }"
@@ -401,150 +403,152 @@
nn "{ Class: SmallInteger }"|
shiftCount > 0 ifTrue:[
- "left shift"
+ "left shift"
- digitShift := shiftCount // 8.
- bitShift := shiftCount \\ 8.
- n := self digitLength.
+ digitShift := shiftCount // 8.
+ bitShift := shiftCount \\ 8.
+ n := self digitLength.
- "
- modulu 8 shifts can be done faster ...
- "
- bitShift == 0 ifTrue:[
- result := self class basicNew numberOfDigits:n + digitShift.
- result sign:self sign.
- result digits replaceFrom:(digitShift + 1) with:self digits.
- "
- no normalize needed, since receiver was already normalized
- "
- ^ result
- ].
+ "
+ modulu 8 shifts can be done faster ...
+ "
+ bitShift == 0 ifTrue:[
+ result := self class basicNew numberOfDigits:n + digitShift.
+ result sign:self sign.
+ result digits replaceFrom:(digitShift + 1) with:self digits.
+ "
+ no normalize needed, since receiver was already normalized
+ "
+ ^ result
+ ].
- "
- less-than-8 shifts can be done faster ...
- "
- digitShift == 0 ifTrue:[
- n := n + 1.
- result := self class basicNew numberOfDigits:n.
- result sign:self sign.
- prev := 0.
- 1 to:n-1 do:[:index |
- byte := self digitAt:index.
- byte := (byte bitShift:bitShift) bitOr:prev.
- result digitAt:index put:(byte bitAnd:16rFF).
- prev := byte bitShift:-8.
- ].
- result digitAt:n put:prev.
- "
- might have stored a 0-byte ...
- "
- prev == 0 ifTrue:[
- ^ result normalize
- ].
- ^ result.
- ].
+ "
+ less-than-8 shifts can be done faster ...
+ "
+ digitShift == 0 ifTrue:[
+ n := n + 1.
+ result := self class basicNew numberOfDigits:n.
+ result sign:self sign.
+ prev := 0.
+ 1 to:n-1 do:[:index |
+ byte := self digitAt:index.
+ byte := (byte bitShift:bitShift) bitOr:prev.
+ result digitAt:index put:(byte bitAnd:16rFF).
+ prev := byte bitShift:-8.
+ ].
+ result digitAt:n put:prev.
+ "
+ might have stored a 0-byte ...
+ "
+ prev == 0 ifTrue:[
+ ^ result compressed
+ ].
+ ^ result.
+ ].
- "
- slow case ...
- "
- n := n + digitShift + 1.
- result := self class basicNew numberOfDigits:n.
- result sign:self sign.
- byte := self digitAt:1.
- byte := (byte bitShift:bitShift) bitAnd:16rFF.
- result digitAt:(digitShift + 1) put:byte.
- revShift := -8 + bitShift.
- 2 to:(self digitLength) do:[:index |
- byte := self digitAt:index.
- byte2 := self digitAt:index-1.
- byte := byte bitShift:bitShift.
- byte2 := byte2 bitShift:revShift.
- byte := byte bitOr:byte2.
- byte := byte bitAnd:16rFF.
- result digitAt:(index + digitShift) put:byte.
- ].
- byte2 := self digitAt:self digitLength.
- byte2 := byte2 bitShift:revShift.
- byte2 := byte2 bitAnd:16rFF.
- result digitAt:(self digitLength + digitShift + 1) put:byte2.
- "
- might have stored a 0-byte ...
- "
- byte2 == 0 ifTrue:[
- ^ result normalize
- ].
- ^ result
+ "
+ slow case ...
+ "
+ n := n + digitShift + 1.
+ result := self class basicNew numberOfDigits:n.
+ result sign:self sign.
+ byte := self digitAt:1.
+ byte := (byte bitShift:bitShift) bitAnd:16rFF.
+ result digitAt:(digitShift + 1) put:byte.
+ revShift := -8 + bitShift.
+ 2 to:(self digitLength) do:[:index |
+ byte := self digitAt:index.
+ byte2 := self digitAt:index-1.
+ byte := byte bitShift:bitShift.
+ byte2 := byte2 bitShift:revShift.
+ byte := byte bitOr:byte2.
+ byte := byte bitAnd:16rFF.
+ result digitAt:(index + digitShift) put:byte.
+ ].
+ byte2 := self digitAt:self digitLength.
+ byte2 := byte2 bitShift:revShift.
+ byte2 := byte2 bitAnd:16rFF.
+ result digitAt:(self digitLength + digitShift + 1) put:byte2.
+ "
+ might have stored a 0-byte ...
+ "
+ byte2 == 0 ifTrue:[
+ ^ result compressed
+ ].
+ ^ result
].
shiftCount < 0 ifTrue:[
- "right shift"
+ "right shift"
- digitShift := shiftCount negated // 8.
- bitShift := shiftCount negated \\ 8.
- n := self digitLength.
+ digitShift := shiftCount negated // 8.
+ bitShift := shiftCount negated \\ 8.
+ n := self digitLength.
- digitShift >= n ifTrue:[
- ^ 0
- ].
+ digitShift >= n ifTrue:[
+ ^ 0
+ ].
- "
- modulu 8 shifts can be done faster ...
- "
- bitShift == 0 ifTrue:[
- n := n-digitShift.
- result := self class basicNew numberOfDigits:n.
- result sign:self sign.
- result digits replaceFrom:1 with:self digits startingAt:(digitShift + 1) .
- n <= 4 ifTrue:[
- ^ result normalize
- ].
- ^ result
- ].
+ "
+ modulu 8 shifts can be done faster ...
+ "
+ bitShift == 0 ifTrue:[
+ n := n-digitShift.
+ result := self class basicNew numberOfDigits:n.
+ result sign:self sign.
+ result digits replaceFrom:1 with:self digits startingAt:(digitShift + 1) .
+ n <= 4 ifTrue:[
+ ^ result compressed
+ ].
+ ^ result
+ ].
- "
- less-than-8 shifts can be done faster ...
- "
- digitShift == 0 ifTrue:[
- result := self class basicNew numberOfDigits:n.
- result sign:self sign.
- prev := 0.
- bitShift := bitShift negated.
- revShift := 8 + bitShift.
- n to:1 by:-1 do:[:index |
- byte := self digitAt:index.
- next := (byte bitShift:revShift) bitAnd:16rFF.
- byte := (byte bitShift:bitShift) bitOr:prev.
- result digitAt:index put:(byte bitAnd:16rFF).
- prev := next.
- ].
- (n <= 5) ifTrue:[
- ^ result normalize
- ].
- ^ result
- ].
+ "
+ less-than-8 shifts can be done faster ...
+ "
+ digitShift == 0 ifTrue:[
+ result := self class basicNew numberOfDigits:n.
+ result sign:self sign.
+ prev := 0.
+ bitShift := bitShift negated.
+ revShift := 8 + bitShift.
+ n to:1 by:-1 do:[:index |
+ byte := self digitAt:index.
+ next := (byte bitShift:revShift) bitAnd:16rFF.
+ byte := (byte bitShift:bitShift) bitOr:prev.
+ result digitAt:index put:(byte bitAnd:16rFF).
+ prev := next.
+ ].
+ (n <= 5) ifTrue:[
+ ^ result compressed
+ ].
+ ^ result
+ ].
- "
- slow case ...
- "
- nn := n-digitShift.
- result := self class basicNew numberOfDigits:nn.
- result sign:self sign.
+ "
+ slow case ...
+ "
+ nn := n-digitShift.
+ result := self class basicNew numberOfDigits:nn.
+ result sign:self sign.
- prev := 0.
- bitShift := bitShift negated.
- revShift := 8 + bitShift.
- n to:(1 + digitShift) by:-1 do:[:index |
- byte := self digitAt:index.
- next := (byte bitShift:revShift) bitAnd:16rFF.
- byte := (byte bitShift:bitShift) bitOr:prev.
- result digitAt:(index - digitShift) put:byte.
- prev := next.
- ].
- "the last stored byte ..."
- ^ result normalize
+ prev := 0.
+ bitShift := bitShift negated.
+ revShift := 8 + bitShift.
+ n to:(1 + digitShift) by:-1 do:[:index |
+ byte := self digitAt:index.
+ next := (byte bitShift:revShift) bitAnd:16rFF.
+ byte := (byte bitShift:bitShift) bitOr:prev.
+ result digitAt:(index - digitShift) put:byte.
+ prev := next.
+ ].
+ "the last stored byte ..."
+ ^ result compressed
].
^ self "no shift"
+
+ "Modified: 5.11.1996 / 14:06:37 / cg"
!
bitTest:anInteger
@@ -592,11 +596,11 @@
result := self class basicNew numberOfDigits:n.
1 to:n do:[:index |
- byte := (anInteger digitAt:index) bitXor:(self digitAt:index).
- result digitAt:index put:byte.
+ byte := (anInteger digitAt:index) bitXor:(self digitAt:index).
+ result digitAt:index put:byte.
].
byte == 0 ifTrue:[
- ^ result normalize
+ ^ result compressed
].
^ result
@@ -606,6 +610,8 @@
(16r112233445566778899 bitXor:16rFF0000000000000000) printStringRadix:16 'EE2233445566778899'
(16r112233445566778899 bitXor:16r112233445566778800) printStringRadix:16
"
+
+ "Modified: 5.11.1996 / 14:06:40 / cg"
!
highBit
@@ -859,9 +865,9 @@
ttt := anInteger.
selfInteger := self.
[ttt ~~ 0] whileTrue:[
- temp := selfInteger \\ ttt.
- selfInteger := ttt.
- ttt := temp
+ temp := selfInteger \\ ttt.
+ selfInteger := ttt.
+ ttt := temp
].
^ selfInteger
@@ -870,6 +876,8 @@
3 gcd:15
132 gcd:55
"
+
+ "Modified: 5.11.1996 / 13:46:18 / cg"
!
lcm:anInteger
@@ -1084,10 +1092,13 @@
!
compressed
- "this is ST-80's name for ST/X's normalize.
- ST/X may be changed for full compatibility."
+ "if the receiver can be represented as a SmallInteger, return
+ a SmallInteger with my value; otherwise return self with leading
+ zeros removed. This method is redefined in LargeInteger."
- ^ self normalize
+ ^ self
+
+ "Modified: 5.11.1996 / 14:07:41 / cg"
!
floor
@@ -1134,10 +1145,15 @@
!
normalize
- "this is ST/X's name for ST-80's compressed.
- ST/X may be changed for full compatibility."
+ "if the receiver can be represented as a SmallInteger, return
+ a SmallInteger with my value; otherwise return self with leading
+ zeros removed.
+ This method is left for backward compatibility - it has been
+ renamed to #compressed for ST-80 compatibility."
- ^ self
+ ^ self compressed
+
+ "Modified: 5.11.1996 / 14:08:24 / cg"
!
rounded
@@ -1161,5 +1177,5 @@
!Integer class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.50 1996-11-04 19:29:07 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.51 1996-11-05 13:31:47 cg Exp $'
! !