Integer.st
changeset 23496 c1ef03a844f8
parent 23382 e11a8bed0f9e
child 23556 2e05c6f6d847
--- 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