If you want to know the number of bits used to represent a SmallInteger, just evaluate: SmallInteger maxVal highBit + 1. SmallInteger maxVal highBit tells the highest bit which can be used to represent a positive SmallInteger, and + 1 accounts for the sign bit of the SmallInteger (0 for positive, 1 for negative). Then you can just rewrite: bitRepresentation ^(self bitRepresentationLength to: 1 by: -1) collect: [:i | Character value: $0 charCode + (self bitAt: i)] as: String Integer>>bitRepresentationLength ^self digitLength * 8 "make sure positive integer bitRepresentation always begins with 0" + (self positive ifTrue: [1] ifFalse: [0]) SmallInteger>>bitRepresentationLength "always use as many bits as the native format to represent a SmallInteger" ^self class maxVal highBit + 1 Nicolas 2011/7/5 Stéphane Ducasse <stephane.ducasse@inria.fr>:
Salut nicolas :)
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...
Yes :)
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
Included in my question is the fact that small integer are encoded on 31 bits (may be I'm wrong) so printing 32 bits represent LargeINteger and so far I want small integetr so was my assumption correct? and what would be a good method to return bitString of a Small Integer.s
2 raisedTo: 29 Â Â Â Â returns 536870912
536870912 class     returns SmallInteger
2 raisedTo: 30 Â Â Â Â returns 1073741824
1073741824 class     returns LargePositiveInteger
-1073741824 class     returns SmallInteger
2 class maxVal     returns 1073741823
-1 * (2 raisedTo: (31-1)) Â Â Â Â returns -1073741824
(2 raisedTo: 30) - 1 Â Â Â Â returns 1073741823
The first bit will aways be the sign with the + 1 trick.
Nicolas
2011/7/4 Sven Van Caekenberghe <sven@beta9.be>:
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