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



Reply via email to