--- a/Integer.st Thu Nov 01 12:27:56 2018 +0100
+++ b/Integer.st Thu Nov 01 12:33:55 2018 +0100
@@ -1233,6 +1233,7 @@
^ self == Integer
! !
+
!Integer methodsFor:'Compatibility-Dolphin'!
highWord
@@ -1496,6 +1497,7 @@
! !
+
!Integer methodsFor:'bcd conversion'!
decodeFromBCD
@@ -1898,11 +1900,103 @@
].
"/ no need to normalize - if the operands were correct
"/ byte == 0 ifTrue:[
-"/ ^ result normalize
+"/ ^ result compressed
"/ ].
^ result
+ "
+ 16rFFFFFFFFFFFFFFFFFFFF0 bitOr:1.0
+ 16rFFFFFFFFFFFFFFFFFFFF0 bitOr:1.0s1
+ 16rFFFFFFFFFFFFFFFFFFFF0 bitOr:1.1
+ "
+
"Modified (comment): / 20-06-2018 / 14:47:43 / Claus Gittinger"
+ "Modified (comment): / 01-11-2018 / 12:10:27 / Stefan Vogel"
+!
+
+bitReversed
+ "swap (i.e. reverse) bits in an integer
+ i.e. a.b.c.d....x.y.z -> z.y.x...b.a.d.c."
+
+ |n "{ Class: SmallInteger }"
+ result byte|
+
+ n := self digitLength.
+ result := self class basicNew numberOfDigits:n.
+
+ 1 to:n do:[:index |
+ byte := (self digitAt:index) bitReversed8.
+ result digitAt:n+1-index put:byte.
+ ].
+ (byte == 0 or:[n < 4]) ifTrue:[
+ ^ result compressed
+ ].
+
+ ^ result
+
+ "
+ 2r1001 asLargeInteger bitReversed printStringRadix:2
+ 2r10011101 asLargeInteger bitReversed printStringRadix:2
+ 2r111110011101 asLargeInteger bitReversed printStringRadix:2
+ 2r11111001110100000000000000000000000000000000000000000001 bitReversed printStringRadix:2
+ -1 asLargeInteger bitReversed printStringRadix:2
+ "
+
+ "Created: / 01-11-2018 / 11:22:42 / Stefan Vogel"
+!
+
+bitReversed16
+ "swap (i.e. reverse) the low 16 bits in an integer
+ the high bits are ignored and clear in the result
+ i.e. xxx.a.b.c.d....x.y.z -> 000.z.y.x...b.a.d.c."
+
+ ^ (self bitAnd:16rffff) bitReversed16.
+
+ "
+ 2r1001 asLargeInteger bitReversed16 printStringRadix:2
+ 2r10011101 asLargeInteger bitReversed16 printStringRadix:2
+ 2r111110011101 asLargeInteger bitReversed16 printStringRadix:2
+ 2r11111001110100000000000000000000000000000000000000000001 bitReversed16 printStringRadix:2
+ -1 asLargeInteger bitReversed16 printStringRadix:2
+ "
+
+ "Created: / 01-11-2018 / 11:34:51 / Stefan Vogel"
+!
+
+bitReversed32
+ "swap (i.e. reverse) the low 32 bits in an integer
+ the high bits are ignored and clear in the result
+ i.e. xxx.a.b.c.d....x.y.z -> 000.z.y.x...b.a.d.c."
+
+ ^ (self bitAnd:16rffffffff) bitReversed.
+
+ "
+ 2r1001 asLargeInteger bitReversed32 printStringRadix:2
+ 2r10011101 asLargeInteger bitReversed32 printStringRadix:2
+ 2r111110011101 asLargeInteger bitReversed32 printStringRadix:2
+ 2r11111001110100000000000000000000000000000000000000000001 bitReversed32 printStringRadix:2
+ -1 asLargeInteger bitReversed32 printStringRadix:2
+ "
+
+ "Created: / 01-11-2018 / 11:35:54 / Stefan Vogel"
+!
+
+bitReversed8
+ "swap (i.e. reverse) the low 8 bits in an integer
+ the high bits are ignored and clear in the result
+ i.e. xxx.a.b.c.d....x.y.z -> 000.z.y.x...b.a.d.c."
+
+ ^ (self digitAt:1) bitReversed8.
+
+ "
+ 2r1001 asLargeInteger bitReversed8 printStringRadix:2
+ 2r10011101 asLargeInteger bitReversed8 printStringRadix:2
+ 2r111110011101 asLargeInteger bitReversed8 printStringRadix:2
+ 2r11111001110100000000000000000000000000000000000000000001 bitReversed8 printStringRadix:2
+ -1 asLargeInteger bitReversed8 printStringRadix:2
+ "
+
+ "Created: / 01-11-2018 / 11:32:58 / Stefan Vogel"
!
bitShift:shiftCount
@@ -4750,6 +4844,60 @@
"
! !
+!Integer methodsFor:'private'!
+
+numberOfDigits:n8BitDigits
+ "initialize the instance to store n8BitDigits"
+
+ ^ self subclassResponsibility.
+
+ "Created: / 01-11-2018 / 11:28:56 / Stefan Vogel"
+!
+
+numberOfDigits:n8BitDigits sign:newSign
+ "initialize the instance to store n8BitDigits and sign"
+
+ ^ self subclassResponsibility.
+
+ "Created: / 01-11-2018 / 12:12:56 / Stefan Vogel"
+!
+
+setSign:aNumber
+ "private: for protocol completeness with LargeIntegers.
+ Returns a smallInteger with my absValue and the sign of the argument.
+ The method's name may be misleading: the receiver is not changed,
+ but a new number is returned."
+
+ |absVal|
+
+ aNumber == 0 ifTrue:[
+ ^ 0
+ ].
+ absVal := self abs.
+ aNumber < 0 ifTrue:[
+ ^ absVal negated
+ ].
+ ^ absVal
+
+ "
+ -4 sign:-1
+ -4 sign:0
+ -4 sign:1
+ -4 sign:-1
+ -4 sign:0
+ -4 sign:1
+ "
+
+ "Modified (format): / 01-11-2018 / 12:22:48 / Stefan Vogel"
+!
+
+sign:aNumber
+ <resource: #obsolete>
+ "destructively change the sign of the receiver"
+
+ ^ self setSign:aNumber
+! !
+
!Integer methodsFor:'queries'!
digitAt:n
@@ -5174,6 +5322,7 @@
"Created: / 09-01-2012 / 17:18:06 / cg"
! !
+
!Integer methodsFor:'special modulo arithmetic'!
add_32:anInteger