On Jul 5, 2011, at 12:26 AM, Nicolas Cellier wrote:

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

what do you mean by this sentence?
That using bitAnd: we can get an idea of the implementation? exactly :)

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