Bitwise OR?

Clemens Hepper ethrandil at gmx.net
Sun Mar 26 20:27:13 EST 2006


Okay... pythons build-in methods are quite fast. so is hex().

with about 64 kb memory i can write it with a 16 bit dictionary
where the dictionary generation itself is not yet optimized:

def genBitList(exp):
  next = lambda now: [x+'0' for x in now]+[x+'1' for x in now]
  result = [""]

  for x in range(exp):
    result = next(result)

  return result

_digits = genBitList(16)

def bitstring2(number):
  """lsb------>msb"""
  rlist = list()
  if number >= 0:
    while number:
      rlist.append( _digits[number & 0xFFFF] )
      number >>= 16
    return ''.join(rlist).rstrip('0')
  else:
    while number != -1:
      rlist.append( _digits[number & 0xFFFF] )
      number >>= 16
    return ''.join(rlist).rstrip('1')

this is quite fast and in lots of cases faster than the
hex()-version. however your method (with my inverses formatting) is
very fast, too and without so much memory expense:

_nibbles = {"0":"0000", "1":"0001", "2":"0010", "3":"0011",
            "4":"0100", "5":"0101", "6":"0110", "7":"0111",
            "8":"1000", "9":"1001", "a":"1010", "b":"1011",
            "c":"1100", "d":"1101", "e":"1110", "f":"1111",
            "l":"", "-":"", "x":""}

from string import maketrans, translate

_invert = maketrans('01', '10')

def bitstring3( number ):
  if number > 0:
    return ''.join( [_nibbles[d] for d in
      hex(  number ).lower()] ).lstrip( '0' )
  else:
    return translate(''.join( [_nibbles[d] for d in
      hex( ~number ).lower()] ).lstrip( '0' ), _invert)

Benchmark:
  for 0xa:
bitstring2: 0.61802315712
bitstring3: 0.91001200676

  for 0xaaaa:
bitstring2: 0.561501026154
bitstring3: 1.11787199974

  for 0xaaaaaaaaaaaa:
bitstring2: 1.2295820713
bitstring3: 1.61559510231

  for 0xaaaaaaaaaaaaaaaaaaaaaaaa:
bitstring2: 1.90036797523
bitstring3: 2.2683339119

  for -0xaaaaaaaaaaaaaaaaaaaaaaaa:
bitstring2: 2.81339716911
bitstring3: 2.74266886711

mfg
- eth



More information about the Python-list mailing list