On 04 Jul 2011, at 20:16, Stéphane Ducasse wrote:
> I would like to see the two complement representation of numbers.
This is what I do, for reading/writing unsigned or two complement signed
integer from/to byte streams.
Note that two complement is only defined for a specific number size, 8, 16, 32
bits.
unsignedToSigned: integer size: size
^ integer < (2 raisedTo: size - 1)
ifTrue: [ integer ]
ifFalse: [ (self twoComplement: integer size: size) negated ]
signedToUnsigned: integer size: size
^ integer negative
ifTrue: [ self twoComplement: integer size: size ]
ifFalse: [ integer ]
twoComplement: integer size: size
| mask |
mask := (2 raisedTo: size) - 1.
^ mask bitAnd: ((integer abs bitXor: mask) + 1)
These are also very handy in this context (I believe I once submitted that as
an issue):
integerFromByteArray: bytes
| integer |
integer := 0.
bytes withIndexDo: [ :each :index |
integer := integer + (each bitShift: (bytes size - index) * 8)
].
^ integer
and Integer>>#asByteArrayOfSize:
Once you have a byte representation, you can render it as bits as well.
Sven