--- a/Integer.st Thu Jul 09 10:25:14 1998 +0200
+++ b/Integer.st Thu Jul 09 10:25:57 1998 +0200
@@ -448,8 +448,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 }"
@@ -464,152 +464,152 @@
nDigits "{ 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.
- "
- modulo 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
- ].
+ "
+ modulo 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 compressed
- ].
- ^ 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.
- nDigits := self digitLength.
- 2 to:nDigits do:[:index |
- byte := self digitAt:index.
- byte2 := self digitAt:index-1.
- byte := byte bitShift:bitShift.
- byte2 := byte2 bitShift:revShift.
- byte := (byte bitOr:byte2) bitAnd:16rFF.
- result digitAt:(index + digitShift) put:byte.
- ].
- byte2 := self digitAt:nDigits.
- byte2 := (byte2 bitShift:revShift) bitAnd:16rFF.
- result digitAt:(nDigits + digitShift + 1) put:byte2.
- "
- might have stored a 0-byte ...
- "
- byte2 == 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.
+ nDigits := self digitLength.
+ 2 to:nDigits do:[:index |
+ byte := self digitAt:index.
+ byte2 := self digitAt:index-1.
+ byte := byte bitShift:bitShift.
+ byte2 := byte2 bitShift:revShift.
+ byte := (byte bitOr:byte2) bitAnd:16rFF.
+ result digitAt:(index + digitShift) put:byte.
+ ].
+ byte2 := self digitAt:nDigits.
+ byte2 := (byte2 bitShift:revShift) bitAnd:16rFF.
+ result digitAt:(nDigits + 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
+ ].
- "
- modulo 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 <= SmallInteger maxBytes ifTrue:[
- ^ result compressed
- ].
- ^ result
- ].
+ "
+ modulo 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 to:n with:self digits startingAt:(digitShift + 1) .
+ n <= SmallInteger maxBytes 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 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 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 compressed
+ 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"
"Modified: / 18.12.1997 / 17:17:29 / stefan"
+ "Modified: / 8.7.1998 / 12:45:24 / cg"
!
bitTest:anInteger
@@ -1517,5 +1517,5 @@
!Integer class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.81 1998-05-17 20:13:57 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.82 1998-07-09 08:25:57 cg Exp $'
! !