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


Reply via email to