Sven do your code work with Smalltalk smallInteger? Because I think that in that case you should have 31 bits?
>> 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 > > >
