On Jul 5, 2011, at 12:26 AM, Nicolas Cellier wrote:
2011/7/5 Douglas McPherson <djm1329@san.rr.com>:
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