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