For positive integers, we have an infinite serie of 0 bits, but we
don't care, we just don't print them.
The problem with two complement is that you have an infinite serie of
leading 1 bits...
Otherwise, you can access the bit at any rank with bitAt:
For example, you could use
bitRepresentation
        ^(self digitLength * 8 + 1 to: 1 by: -1) collect: [:i | Character
value: $0 charCode + (self bitAt: i)] as: String

The first bit will aways be the sign with the + 1 trick.

Nicolas

2011/7/4 Sven Van Caekenberghe <[email protected]>:
>
> On 04 Jul 2011, at 20:16, Stéphane Ducasse wrote:
>
>> 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