Python: установка количества битов (popcount)

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

13
задан Community 23 May 2017 в 12:09
поделиться

7 ответов

то, что Вы ищете, называют Вес Hamming .

в Python 2.6/3.0 это может быть найдено скорее легко с:

bits = sum( b == '1' for b in bin(x)[2:] )
9
ответ дан Autoplectic 23 May 2017 в 22:09
поделиться

Python 2.6 или 3.0:

def bitsoncount(x):
    return bin(x).count('1')

Пример:

>>> x = 123
>>> bin(x)
'0b1111011'
>>> bitsoncount(x) 
6

Или

ответ Matt Howells в Python:

def bitsoncount(i):
    assert 0 <= i < 0x100000000
    i = i - ((i >> 1) & 0x55555555)
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333)
    return (((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) & 0xffffffff) >> 24
33
ответ дан Community 23 May 2017 в 22:09
поделиться

Какую версию Python Вы используете? Прежде всего Python использует пробел не точка с запятой, так для запуска это должно выглядеть примерно так...

  def bitsoncount(x): 
      b=0
      while(x > 0):
          x &= x - 1   
          b+=1
      return b
4
ответ дан Kev 23 May 2017 в 22:09
поделиться
  • 1
    Спасибо за geom_text часть. Можно ли объяснить ymax переменное обоснование? – Michael Street 26 July 2012 в 03:10

Прямой перевод Вашего алгоритма C следующие:

def bitsoncount(x):
    b = 0
    while x > 0:
        x &= x - 1
        b += 1
    return b
3
ответ дан jfs 23 May 2017 в 22:09
поделиться

Попробуйте этот модуль:

import sys
if sys.maxint < 2**32:
    msb2= 2**30
else:
    msb2= 2**62
BITS=[-msb2*2] # not converted into long
while msb2:
    BITS.append(msb2)
    msb2 >>= 1

def bitcount(n):
    return sum(1 for b in BITS if b&n)

Это должно работать на целые числа машины (в зависимости от Вашей ОС и версии Python). Это не будет работать ни на какой long.

0
ответ дан tzot 23 May 2017 в 22:09
поделиться
  • 1
    @RwardBound я знаю. Я сознательно опустил текстовые метки, потому что я философски настроен против маркировки столбиковых диаграмм тем способом. (Но если Вы были для создания маркировок, Вы wouldn' t используют что-либо в scale_y_continuous.) – joran 26 July 2012 в 02:58

Возможно, это - то, что Вы имеете в виду?

def bits_on_count(x):
    b = 0
    while x != 0:
        if x & 1: # Last bit is a 1
            b += 1
        x >>= 1 # Shift the bits of x right
    return b

существует также способ сделать это просто в Python 3.0:

def bits_on_count(x):
  return sum(c=='1' for c in bin(x))

Это использует то, что мусорное ведро (x) дает двоичное представление x.

2
ответ дан Kiv 23 May 2017 в 22:09
поделиться

Как вам этот:

def bitsoncount(x):
    b   = 0
    bit = 1
    while bit <= x:
        b += int(x & bit > 0)
        bit = bit << 1

    return b

По сути, вы используете тестовый бит, который начинается справа и полностью сдвигается до длины вашего in-параметра в битах. Для каждой позиции бит & x дает один бит, который включен или отсутствует. Проверьте> 0 и превратите полученное значение True | False в 1 | 0 с помощью int () и добавьте его в аккумулятор. Кажется, хорошо работает на длинные позиции :-).

0
ответ дан 1 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: