2011/7/5 Douglas McPherson <[email protected]>:
> 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.
>
>

That's true, but the internal implementation leaks out the bitAnd:
bitOr: and other bit operations...

Nicolas

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