Integer.st
changeset 22070 9ff5b5333e3e
parent 22069 1898747d4358
child 22071 9423b8769ca7
--- a/Integer.st	Fri Jul 21 14:46:26 2017 +0200
+++ b/Integer.st	Fri Jul 21 14:54:12 2017 +0200
@@ -2694,24 +2694,62 @@
      The bit numbering is 1-based (i.e. the lowest bit has bitNr 1)    
      This may be useful for communication interfaces"
 
+    ^ self signExtendedFromMaskBit:(1 bitShift:bitNr-1)
+
+    "
+     2r111000111 signExtendedFromBit:3 -> 2r11111....111 -> -1 
+     2r111000110 signExtendedFromBit:3 -> 2r11111....110 -> -2 
+     2r111000101 signExtendedFromBit:3 -> 2r11111....101 -> -3   
+     2r111000100 signExtendedFromBit:3 -> 2r11111....100 -> -4 
+     2r111000000 signExtendedFromBit:3 -> 2r00000....000 -> 0   
+     2r111000011 signExtendedFromBit:3 -> 2r00000....011 -> 3  
+
+     16r800008 signExtendedFromBit:4 -> -8 
+     16r7FFF07 signExtendedFromBit:4 -> 7 
+     16r7FFF0F signExtendedFromBit:4 -> -1
+
+     16rFFFFFF signExtendedFromBit:8 -> -1
+     16rFFFF7F signExtendedFromBit:8 -> 127
+     16rFFFF80 signExtendedFromBit:8 -> -128
+    "
+
+    "Modified: / 21-07-2017 / 14:53:40 / cg"
+!
+
+signExtendedFromMaskBit:highBitMask
+    "return an integer from sign-extending the bit defined by highMaskBit,
+     which MUST be a single bit (otherwise, you'll get garbage).
+     i.e. interprets the lowest n bits as a signed integer,
+     ignoring higher bits.
+     This may be useful for communication interfaces and to expand bitfields into
+     signed values"
+
     |masked|
 
-    masked := self bitAnd:((1 bitShift:bitNr)-1).
-    (self isBitSet:bitNr) ifTrue:[
-        ^ masked - (1 bitShift:bitNr)
+    masked := self bitAnd:(highBitMask-1).
+    (self bitTest:highBitMask) ifTrue:[
+        ^ masked - highBitMask
     ].
     ^ masked
 
     "
-     16r800008 signExtendedFromBit:4  
-     16r7FFF07 signExtendedFromBit:4  
-     16r7FFF0F signExtendedFromBit:4 
-
-     16rFFFFFF signExtendedFromBit:8
-     16rFFFF7F signExtendedFromBit:8
-    "
-
-    "Modified (comment): / 26-02-2016 / 19:42:18 / cg"
+     2r111000111 signExtendedFromMaskBit:2r100 -> 2r11111....111 -> -1 
+     2r111000110 signExtendedFromMaskBit:2r100 -> 2r11111....110 -> -2 
+     2r111000101 signExtendedFromMaskBit:2r100 -> 2r11111....101 -> -3   
+     2r111000100 signExtendedFromMaskBit:2r100 -> 2r11111....100 -> -4 
+     2r111000000 signExtendedFromMaskBit:2r100 -> 2r00000....000 -> 0   
+     2r111000011 signExtendedFromMaskBit:2r100 -> 2r00000....011 -> 3  
+
+     16r800008 signExtendedFromMaskBit:2r1000 -> -8 
+     16r7FFF07 signExtendedFromMaskBit:2r1000 -> 7 
+     16r7FFF0F signExtendedFromMaskBit:2r1000 -> -1
+
+     16rFFFFFF signExtendedFromMaskBit:2r10000000 -> -1
+     16rFFFF7F signExtendedFromMaskBit:2r10000000 -> 127
+     16rFFFF80 signExtendedFromMaskBit:2r10000000 -> -128
+    "
+
+    "Created: / 21-07-2017 / 14:52:12 / cg"
 !
 
 signExtendedLongLongValue