Two's complement is a platform representation of integers not (necessarily) a 
smalltalk one. The concept of negative numbers has nothing to do with the radix 
a number is expressed in.

There are convenient extensions to the ByteArray protocol added by FFI which 
allow easy conversion though. I don't have time this second to list them, but 
will do so in a few hours.



On Jul 4, 2011, at 15:14 , Stéphane Ducasse wrote:

> 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