Re: Can string formatting be used to convert an integer to its binary form ?
[EMAIL PROTECTED] schreef: > Hi, > > String formatting can be used to converting an integer to its octal or > hexadecimal form: a = 199 "%o" % a > '307' "%x" % a > 'c7' > > But, can string formatting be used to convert an integer to its binary > form ? > > > Thanks in advance. > > xiaojf I don't actually know how to do it with string formatting but you can create a simple function to do it. Here's an example: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/219300 Regards, Benedict -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Thus spoke [EMAIL PROTECTED] (on 2006-09-28 09:10): > String formatting can be used to converting an integer to its octal or > hexadecimal form: > >>> a = 199 > >>> "%o" % a > '307' > >>> "%x" % a > 'c7' > > But, can string formatting be used to convert an integer to its binary > form ? I didn't fell over this problem so far but I *would* have expected to find something like a 'pack' operator (as in Perl). And voilá, there is (even basically identical to Perl): from struct import * a = 199 a_bin_str = pack('L', a) Regards Mirco -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
At Thursday 28/9/2006 05:22, Mirco Wahab wrote: > String formatting can be used to converting an integer to its octal or > hexadecimal form: > >>> a = 199 > >>> "%o" % a > '307' > >>> "%x" % a > 'c7' > > But, can string formatting be used to convert an integer to its binary > form ? a = 199 a_bin_str = pack('L', a) Notice that the OP was looking for another thing, given the examples. Perhaps a better wording would have been "how to convert an integer to its base-2 string representation". Gabriel Genellina Softlab SRL __ Preguntá. Respondé. Descubrí. Todo lo que querías saber, y lo que ni imaginabas, está en Yahoo! Respuestas (Beta). ¡Probalo ya! http://www.yahoo.com.ar/respuestas -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Thus spoke Gabriel Genellina (on 2006-09-28 11:05): > At Thursday 28/9/2006 05:22, Mirco Wahab wrote: >> > But, can string formatting be used to convert an integer to its binary >> > form ? >> >> a = 199 >> a_bin_str = pack('L', a) > > Notice that the OP was looking for another thing, given the examples. > Perhaps a better wording would have been "how to convert an integer > to its base-2 string representation". Yes, you are right. The OP looks for a 'binary (bit) representation ..." I admit I didn't find out how to format a value into a bit string in Python. In Perl, this would be a no-brainer: $var = 199; $str = sprintf "%0*b", 32, $var; and str would contain 11000111 on a intel machine. But where is the %b in Python? Regards & Thanks Mirco -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Mirco Wahab: > But where is the %b in Python? Python doesn't have that. You can convert the number to a hex, and then map the hex digitds to binary strings using a dictionary, like this: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528 Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
[EMAIL PROTECTED] wrote: > Mirco Wahab: > >> But where is the %b in Python? >> > > Python doesn't have that. You can convert the number to a hex, and then > map the hex digitds to binary strings using a dictionary, like this: > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528 > > Bye, > bearophile > > Good idea, but shorter with -> http://cheeseshop.python.org/pypi/SE/2.2%20beta >>> import SE >>> Int_To_Binary = SE.SE (SE.SE ('0= 1=0001 2=0010 3=0011 4=0100 5=0101 6=0110 7=0111 8=1000 9=1001 A=1010 a=1010 B=1011 b=1011 C=1100 c=1100 D=1101 d=1101 E=1110 e=1110 F= f=') >>> Int_To_Binary ('%x' % 1234567890') '0100100110010110001011010010' >>> Int_To_Binary.save ('se_definition_files/int_to_binary.se') >>> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321) '0011101011000110100010110001' Frederic -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Thus spoke Frederic Rentsch (on 2006-09-28 20:43): > [EMAIL PROTECTED] wrote: >> Mirco Wahab: >> >>> But where is the %b in Python? >> >> Python doesn't have that. ... >> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528 > > Good idea, but shorter with -> > http://cheeseshop.python.org/pypi/SE/2.2%20beta > SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321) > '0011101011000110100010110001' I don't really understand here: - why doesn't have Python such a simple and useful thing as to_binstr(...) even C++ has one built in, #include #include int somefunc() { int val = 199; std::cout << std::bitset<32>( val ); ... - why would you favor such complicated solutions for this (as posted), when you can have this in one line, e.g.: def int2bin(num, width=32): return ''.join(['%c'%(ord('0')+bool((1
Re: Can string formatting be used to convert an integer to its binary form ?
In <[EMAIL PROTECTED]>, Mirco Wahab wrote: > Thus spoke Frederic Rentsch (on 2006-09-28 20:43): >> [EMAIL PROTECTED] wrote: >>> Mirco Wahab: >>> But where is the %b in Python? >>> >>> Python doesn't have that. ... >>> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528 >> >> Good idea, but shorter with -> >> http://cheeseshop.python.org/pypi/SE/2.2%20beta >> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321) >> '0011101011000110100010110001' > > I don't really understand here: > > - why doesn't have Python such a simple and useful thing as to_binstr(...) Maybe simple, but useful? And if you really need this it's simple to implement or look up in the cook book. > - why would you favor such complicated solutions > for this (as posted), when you can have this > in one line, e.g.: > > def int2bin(num, width=32): > return ''.join(['%c'%(ord('0')+bool((1< range((width-1),-1,-1)]) Yeah, I wonder why not everybody sees the beauty in this cool and straightforward one liner. ;-) Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Mirco Wahab wrote: > - why doesn't have Python such a simple and useful thing as to_binstr(...) useful? really? for what? -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Thus spoke Marc 'BlackJack' Rintsch (on 2006-09-28 23:38): >> def int2bin(num, width=32): >> return ''.join(['%c'%(ord('0')+bool((1<> range((width-1),-1,-1)]) > > Yeah, I wonder why not everybody sees the beauty in this cool and > straightforward one liner. ;-) Right. I see this is BS, maybe lots of these lines exist already, one could come up with (sorted by obfuscation, descending): def int2bin(num, width=32): # return ''.join( [chr(ord('0')+bool(1<>k & 1),range(width-1, -1, -1)) ) # return ''.join( [str(num>>k & 1)for k in range(width-1, -1, -1)] ) But after some thinking, I thought about discussing this one: def i2b(num, width): return str(1 & num>>(width-1)) + i2b(num, width-1) if width else '' which is the shortest ;-) (Sorry but I'm more or less a newbie, maybe this is BS too ...) Regards Mirco -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Thus spoke Fredrik Lundh (on 2006-09-28 23:35): > Mirco Wahab wrote: > >> - why doesn't have Python such a simple and useful thing as to_binstr(...) > > useful? really? for what? I don't really know, but according to google, people often ask exactly for that and there is no reason at all why one shouldn't expect to get a /bit string/ from "%b" %. So if people think it's badly needed, how couldn't it be *not* useful then? ;-) It feels to me (as it does sometimes when diving into Python, to be honest) simply as a shortcoming, - and the ter- nary operator included in 2.5 was imho a huge step forward, next will be mutable strings and arrays will be 'called arrays' somewhere ... ;-) (maybe somebody reverses the -v/-V switch too, hey) Regards Mirco -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Frederic Rentsch: > Good idea, but shorter with -> > >>> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321) > '0011101011000110100010110001' Note that your version keeps the leading zeros. Have you tested the relative speeds too? (I'll probably have to learn to use SE.) Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
In message <[EMAIL PROTECTED]>, [EMAIL PROTECTED] wrote: > Mirco Wahab: >> But where is the %b in Python? > > Python doesn't have that. You can convert the number to a hex, and then > map the hex digitds to binary strings using a dictionary, like this: > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440528 How about this: (where n is the integer you want to convert): "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)]) -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
In message <[EMAIL PROTECTED]>, I wrote: > "".join([["0", "1"][(1 << i & n) != 0] for i in > range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)]) Uh, make that "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.floor(math.log(n, 2))), -1, -1)]) Need to check those corner cases. :) -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
At Thursday 28/9/2006 22:07, Lawrence D'Oliveiro wrote: How about this: (where n is the integer you want to convert): "".join([["0", "1"][(1 << i & n) != 0] for i in range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)]) Uhm... so to generate a binary string you have to import the math module, convert the integer to float, compute a non-standard logarithm, and then... What if n<=0? Too much, don't you think? :) Gabriel Genellina Softlab SRL __ Preguntá. Respondé. Descubrí. Todo lo que querías saber, y lo que ni imaginabas, está en Yahoo! Respuestas (Beta). ¡Probalo ya! http://www.yahoo.com.ar/respuestas -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Gabriel Genellina wrote: > At Thursday 28/9/2006 22:07, Lawrence D'Oliveiro wrote: > > >How about this: (where n is the integer you want to convert): > > > > "".join([["0", "1"][(1 << i & n) != 0] for i in > > range(int(math.ceil(math.log(n, 2))) - 1, -1, -1)]) > > Uhm... so to generate a binary string you have to import the math > module, convert the integer to float, compute a non-standard > logarithm, and then... > What if n<=0? > Too much, don't you think? :) Having recently discovered the joy of obfuscated python thanks to the Code Golf challenges, here's the shortest non-recursive function I came up with (all integers, signed): f=lambda n:'-'[:n<0]+''.join(str(m&1)for m in iter( lambda x=[abs(n)]:(x[0],x.__setitem__(0,x[0]>>1))[0],0))[::-1]or'0' Any takers ? ;-) George -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
So far as unobfuscated versions go, how about the simple: def to_bin(x): out = [] while x > 0: out.insert(0, str(x % 2)) x = x / 2 return ''.join(out) Regards, Jordan -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
MonkeeSage wrote: > So far as unobfuscated versions go, how about the simple: > > def to_bin(x): > out = [] > while x > 0: > out.insert(0, str(x % 2)) > x = x / 2 > return ''.join(out) > > Regards, > Jordan > >>> to_bin(0) '' 6/10: try harder :) regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://holdenweb.blogspot.com Recent Ramblings http://del.icio.us/steve.holden -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
"MonkeeSage" <[EMAIL PROTECTED]> writes: > def to_bin(x): > out = [] > while x > 0: > out.insert(0, str(x % 2)) > x = x / 2 > return ''.join(out) That returns the empty string for x=0. I'm not sure if that's a bug or a feature. It also returns the empty string for x < 0, probably a bug. It will break in Python 3, where 1 / 2 == 0.5. Here's yet another version: def to_bin(n): if n < 0: return '-' + to_bin(-n) if n==0: return '0' return ''.join( ("", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "",)[int(d,16)] \ for d in '%x'%n).lstrip('0') -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Steve Holden wrote: > MonkeeSage wrote: > > So far as unobfuscated versions go, how about the simple: > > > > def to_bin(x): > > out = [] > > while x > 0: > > out.insert(0, str(x % 2)) > > x = x / 2 > > return ''.join(out) > > > > Regards, > > Jordan > > > >>> to_bin(0) > '' > > 6/10: try harder :) Ok, how about a fast *and* readable version? Works for non-negatives, but negatives are trivial to add if necessary: from array import array def fast2bin(n): s = array('c') while n>0: s.append('01'[n&1]) n >>= 1 s.reverse() return s.tostring() or '0' try: import psyco except ImportError: pass else: psyco.bind(fast2bin) George -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Steve Holden wrote: > >>> to_bin(0) > '' Doh! Oh, yeah...that! ;) OK... def to_bin(x): out=[] while x > 0: out.insert(0, str(x % 2)) x /= 2 else: out.append(str(x)) return ''.join(out) Regards, Jordan -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
MonkeeSage wrote: > Steve Holden wrote: > >> >>> to_bin(0) >>'' > > > Doh! Oh, yeah...that! ;) > > OK... > > def to_bin(x): > out=[] > while x > 0: > out.insert(0, str(x % 2)) > x /= 2 > else: > out.append(str(x)) > return ''.join(out) > It's an often-missed and almost invariably untested corner case that one's first attempt to solve the problem usually rids one of. I have written binary format code about thirteen times in a lifetime of programming so it was easy for me to spot. You'll never make *that* mistake again ;-) Unfortunately forty years of programming experience has taught me that there's an essentially infinite supply of mistakes to make ... your mistakes just get smarter most of the time. regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://holdenweb.blogspot.com Recent Ramblings http://del.icio.us/steve.holden -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
[EMAIL PROTECTED] wrote: > Frederic Rentsch: > >> Good idea, but shorter with -> >> >>> SE.SE ('se_definition_files/int_to_binary.se') ('%X' % 987654321) >> '0011101011000110100010110001' >> > > Note that your version keeps the leading zeros. > Have you tested the relative speeds too? > (I'll probably have to learn to use SE.) > > Bye, > bearophile > > If you say speed, I presume you mean speed of execution. No I have not tested that. I know it can't be fast on a test bench. After all, SE is written in Python. I did a first version fifteen years ago in C, am still using it today on occasion and it runs much, much faster than this Python SE. This SE here could be done in C if it passes the test of acceptance. Professionals need to measure execution speed as a part of documenting their products. I am not a professional and so I am free to define my own scale of grades: A (fast enough) and F (not fast enough). I have yet to encounter a situation where SE gets an F. But that says less about SE than about my better knowledge which prevents me from using SE to, say, change colors in a 50 Mb bitmap. Obviously, "fast enough" and "not fast enough" pertains not to code per se, but to code in a specific situation. So, as the saying goes: the proof of the pudding ... Another kind of speed is production speed. I do believe that SE rather excels on that side. I also believe that the two kinds of speed are economically related by the return-on-investment principle. The third kind of speed is learning speed. SE is so simple that it has no technical learning curve to speak of. It's versatility comes from a wealth of application techniques that invite exploration, invention even. Take leading zeroes: Leading zeroes can be stripped in a second pass if they are made recognizable in the first pass by some leading mark that is not a zero or a one. ([^01]; I use "@" in the following example). To purists this may seem hackish. So it is! And what's wrong with that if it leads to simpler solutions? >>> Hex_To_Binary = SE.SE ('0= 1=0001 2=0010 3=0011 4=0100 5=0101 6=0110 7=0111 8=1000 9=1001 A=1010 a=1010 B=1011 b=1011 C=1100 c=1100 D=1101 d=1101 E=1110 e=1110 F= f= | ~[^01]0*~=') >>> Hex_To_Binary.set (keep_chain = 1) >>> Hex_To_Binary ('@%x' % 1234567890) '100100110010110001011010010' >>> Hex_To_Binary.show () ... snip ... Data Chain -- @499602d2 0 @0100100110010110001011010010 1 100100110010110001011010010 -- Frederic (The previously posted example "Int_To_Binary = SE.SE (SE.SE ( ..." was a typo, or course. One (SE.SE does it. Sorry about that.) -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
On 9/29/06, Steve Holden <[EMAIL PROTECTED]> wrote: > Unfortunately forty years of programming experience has taught me that > there's an essentially infinite supply of mistakes to make ... your > mistakes just get smarter most of the time. +1 QOTW. -- Cheers, Simon B, [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
On 2006-09-29, Steve Holden <[EMAIL PROTECTED]> wrote: > MonkeeSage wrote: >> So far as unobfuscated versions go, how about the simple: >> >> def to_bin(x): >> out = [] >> while x > 0: >> out.insert(0, str(x % 2)) >> x = x / 2 >> return ''.join(out) >> >> Regards, It was surprising that >>> i = int("111010101", 2) is a one-way operation. >>> s = str(i, 2) Traceback (most recent call last): File "", line 1, in ? TypeError: str() takes at most 1 argument (2 given) -- Neil Cerutti -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
Neil Cerutti wrote: > On 2006-09-29, Steve Holden <[EMAIL PROTECTED]> wrote: >> MonkeeSage wrote: >>> So far as unobfuscated versions go, how about the simple: >>> >>> def to_bin(x): >>> out = [] >>> while x > 0: >>> out.insert(0, str(x % 2)) >>> x = x / 2 >>> return ''.join(out) >>> >>> Regards, > > It was surprising that > i = int("111010101", 2) > > is a one-way operation. > s = str(i, 2) > Traceback (most recent call last): > File "", line 1, in ? > TypeError: str() takes at most 1 argument (2 given) str() is not only for converting integers, but all other types too. An explicit argument for this special case is not Pythonic IMO. Georg -- http://mail.python.org/mailman/listinfo/python-list
Re: Can string formatting be used to convert an integer to its binary form ?
On 2006-09-29, Georg Brandl <[EMAIL PROTECTED]> wrote: > Neil Cerutti wrote: >> On 2006-09-29, Steve Holden <[EMAIL PROTECTED]> wrote: >>> MonkeeSage wrote: So far as unobfuscated versions go, how about the simple: def to_bin(x): out = [] while x > 0: out.insert(0, str(x % 2)) x = x / 2 return ''.join(out) Regards, >> >> It was surprising that >> > i = int("111010101", 2) >> >> is a one-way operation. >> > s = str(i, 2) >> Traceback (most recent call last): >> File "", line 1, in ? >> TypeError: str() takes at most 1 argument (2 given) > > str() is not only for converting integers, but all other types > too. An explicit argument for this special case is not Pythonic > IMO. I suppose two wrongs wouldn't make a right. ;) -- Neil Cerutti -- http://mail.python.org/mailman/listinfo/python-list