Oh... and while I hate to use acronyms like this, I did indeed LOL.

What happened was, I was feeding the strings I got out into the
Windows calculator to check it was working.

And they worked if they went backwards, and I was wondering why, and I
vaguely recalled something I read in a Java book about 'endianess' and
Windows being bigendian.
So, there you go, thought I, the biggest bit (2**32) goes first, so
Windows must be bigEndian!

Oops. Next time, I'll google.

Thanks Kent for clearing that up.


Sandip - 

Just looking at this - 
i = 456
s = ''
while i:
    s = str(i % 2) + s
    i/=2

This works, far simpler than mine, which is always infuriating, but my
question is, how exactly?

if I have the number 15, when it divides by 2, it will become 7. Yet
no error is introduced into the binary. Argggg. Driving me nuts trying
to figure out how. I thought maybe a larger odd number would do it,
but no.

i = 320977545
s = 10011001000011011101010001001

Chuck that into ol' calc, and I get, 320977545. 

Can anyone shed some more light on this?


Regards, 

Liam Clarke


On Sat, 05 Feb 2005 10:48:01 -0500, Kent Johnson <[EMAIL PROTECTED]> wrote:
> Liam,
> 
> I think you misunderstand what endianness is.
> 
> Big-endian and little-endian refer to the way a number is stored as bytes in 
> the underlying memory
> of the computer. This is not something you generally need to worry about in a 
> Python program.
> 
> For example, consider the number 0x12345678. On most modern computers this 
> will be stored in four
> consecutive bytes of computer memory. The individual bytes will contain the 
> values 0x12, 0x34, 0x56,
> 0x78. The question is, what is the order of those bytes in memory? On a 
> big-endian computer, the
> most significant byte - 0x12 - is stored at the lowest memory address, so the 
> sequence of bytes will
> be 0x12, 0x34, 0x56, 0x78. On a little-endian computer, the least-significant 
> byte is stored at the
> lowest address, and the order will be reversed: 0x78, 0x56, 0x34, 0x12.
> 
> Most programming languages will hide this detail from you most of the time. 
> Even in assembly
> language, you generally load and store integers without worrying about 
> endianness. Math operations
> just do the right thing so you don't have to worry about it.
> 
> Endianness becomes an issue when you want to convert between representations, 
> and when binary data
> is shared between computers which may have different endianness.
> 
> For example in a C program you might want to get the high byte of an integer 
> when you know the
> address of the integer. The desired byte will be at (address+0) or 
> (address+3) depending on the
> endianness of the hardware.
> 
> Similarly, if an array of integers is written to a file in a binary 
> representation (not as ASCII
> strings representing the integers, but as 32-bit values), then to correctly 
> read the file you have
> to know the endianness of the data in the file.
> 
> OK, so what does this have to do with converting a number to binary in 
> Python? Well, nothing,
> actually. First, note that 'binary representation' can mean two different 
> things. In the description
> above, I was talking about the actual bit pattern stored in the computer. 
> Python works with binary
> numbers all the time, in this sense, but it is under the hood. The other 
> meaning of 'binary
> representation' is that of a base-2 string representation of a number.
> 
> So if you ask, "How do I convert a number to binary?" you can mean either of 
> these.
> 
> The first one is trivial. If you have a decimal string representation of the 
> number, use int() to
> convert it to binary. If you have an integer already, it's already *in* 
> binary, so you don't have to
> do anything!
> 
> So, "How do I convert a number to binary?", to be interesting, must mean "How 
> do I convert an
> integer to a base-2 string representation?" And how do you do this? Well, you 
> figured out one way
> using the mathematical properties of integers. These operations are 
> independent of endianness, and
> so is the desired result.
> 
> The base-2 string representation of  the number (whose base-16 string 
> representation is) 0x1234 is
> '0001001000110100'. The order of digits here is determined by our convention 
> of writing the most
> significant digits on the left, not by the endianness of the underlying 
> computer.
> 
> OK, this is long enough, I hope I have shed some light...
> Kent
> 
> 
> Liam Clarke wrote:
> > Jacob - just for you, begin your agitation for the next release please ;)
> >
> > binstring.py, as attached.
> > (also pasted up - http://www.rafb.net/paste/results/5feItM57.html)
> >
> > Creating this, was just a brain teaser, but I was thinking 'what if I
> > wanted to make this for the standard library.'
> >
> > And so you can see, I had to include a flag for endianess. But that
> > was really a cheap trick. If this was going into a standard library,
> > I'd want to query the OS for endianess. As for the bits, once again,
> > 32 bit is the norm, but 64 bit is here and spreading.
> >
> > Also, should it display 11111111 as 255 or 256? Both are valid,
> > depending on context.
> >
> > Thirdly, if I can do it in 2 minutes, (well, the main part), then
> > should they bother putting it in the standard library considering
> > also,
> >
> > - How often, really, are you going to need to present a decimal or hex
> > as a binary string.
> >
> > Lastly - this only does base 10 to base 2. Should I include a base 6
> > to base 2, base 8 to base 2, base 10 to 6, 10 to 8, 8 to 6?
> >
> > I wouldn't like to write for the standard library, because you can
> > never please everyone.
> >
> > But yeah, feel free to use the above, just keep my doc strings and comments.
> >
> > Regards,
> >
> > Liam Clarke
> >
> > On Fri, 4 Feb 2005 23:30:19 -0500, Jacob S. <[EMAIL PROTECTED]> wrote:
> >
> >>>The binary value is the same as the hex value.
> >>>The binary representation is 000111110100, but
> >>>unfortunately Python doesn't support binary in
> >>>its string formatting(although it does in int()!
> >>
> >>Uh, question. Why not? It seems that all simple types should be included.
> >>Since the computer stores it as binary, why shouldn't python be able to
> >>display a
> >>string of it in binary? That seems to be a short coming that should be added
> >>to the
> >>next release... IMHO of course.
> >>Jacob Schmidt
> >>
> >>_______________________________________________
> >>Tutor maillist  -  [email protected]
> >>http://mail.python.org/mailman/listinfo/tutor
> >>
> >
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > ######
> > # binString.py
> > # by Liam Clarke
> > #(Let me know when it's included in the standard library ;-))
> > ######
> >
> > """Converts a integer base 10 to a string base 2"""
> >
> > def binary(decimalInt, bigEndian = True, bits = 32, truncExcess = False):
> >     """
> > Integer to be converted is essential, Endianess is an optional flag;
> > me being a Win32 user, Endianess is big by default, defaults to a 32-bit
> > representation, most integers in Python being 32 bit. truncExcess will
> > strip place-holder zeros for succintness.
> >
> > Oh, and it will represent 11111111 as 256, as I'm not sure whether you want
> > to start counting for zero with this. It's a simple matter to change."""
> >     tempList = ['0' for x in range(bits)]
> >
> >     for bitPlace in range(bits, -1, -1):
> >         if decimalInt - 2**bitPlace >= 0:
> >             tempList[bitPlace] = '1'
> >             decimalInt = decimalInt - 2**bitPlace
> >     if bigEndian:
> >         tempList.reverse()
> >
> >     outPut = ''.join(tempList)
> >
> >     if truncExcess:
> >         if bigEndian:
> >             outPut=outPut.lstrip('0')
> >         else:
> >             outPut=outPut.rstrip('0')
> >
> >     return outPut
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Tutor maillist  -  [email protected]
> > http://mail.python.org/mailman/listinfo/tutor
> 
> _______________________________________________
> Tutor maillist  -  [email protected]
> http://mail.python.org/mailman/listinfo/tutor
> 


-- 
'There is only one basic human right, and that is to do as you damn well please.
And with it comes the only basic human duty, to take the consequences.
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to