--- 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