Строки в 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 в коде. В противном случае вы столкнетесь с ошибками.
то, что Вы ищете, называют Вес Hamming .
в Python 2.6/3.0 это может быть найдено скорее легко с:
bits = sum( b == '1' for b in bin(x)[2:] )
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
Какую версию Python Вы используете? Прежде всего Python использует пробел не точка с запятой, так для запуска это должно выглядеть примерно так...
def bitsoncount(x):
b=0
while(x > 0):
x &= x - 1
b+=1
return b
Прямой перевод Вашего алгоритма C следующие:
def bitsoncount(x):
b = 0
while x > 0:
x &= x - 1
b += 1
return b
Попробуйте этот модуль:
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
.
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.
Как вам этот:
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 () и добавьте его в аккумулятор. Кажется, хорошо работает на длинные позиции :-).