How do you count the number of ones in a given integer’s binary representation.
Say you are given a number 20
, which is 10100
in binary, so number of ones is 2.
jamylak
128k30 gold badges230 silver badges230 bronze badges
asked Mar 21, 2013 at 6:24
What you’re looking for is called the Hamming weight, and there are a lot of algorithms to do it. Here’s another straightforward one:
def ones(n):
w = 0
while (n):
w += 1
n &= n - 1
return w
answered Mar 21, 2013 at 6:31
CairnarvonCairnarvon
25.6k9 gold badges51 silver badges65 bronze badges
1
Use the awesome collections
module.
>>> from collections import Counter
>>> binary = bin(20)[2:]
>>> Counter(binary)
Counter({'0': 3, '1': 2})
Or you can use the built-in function count()
:
>>> binary = bin(20)[2:]
>>> binary.count('1')
2
Or even:
>>> sum(1 for i in bin(20)[2:] if i == '1')
2
But that last solution is slower than using count()
answered Mar 21, 2013 at 6:27
TerryATerryA
58.6k11 gold badges114 silver badges142 bronze badges
9
>>> num = 20
>>> bin(num)[2:].count('1')
2
answered Mar 21, 2013 at 6:28
YarkeeYarkee
8,9265 gold badges28 silver badges29 bronze badges
1
The usual way to make this blinding fast is to use lookup tables:
table = [bin(i)[2:].count('1') for i in range(256)]
def pop_count(n):
cnt = 0
while n > 0:
cnt += table[n & 255]
n >>= 8
return cnt
In Python, any solution using bin
and list.count
will be faster, but this is nice if you want to write it in assembler.
vvvvv
23.8k19 gold badges48 silver badges75 bronze badges
answered Mar 21, 2013 at 6:37
Torsten MarekTorsten Marek
83k21 gold badges91 silver badges98 bronze badges
2
The int
type has a new method int.bit_count()
since python 3.10a, returning the number of ones in the binary expansion of a given integer, also known as the population count as follows:
n = 20
bin(n)
'0b10100'
n.bit_count()
returns 2
as it has 2 ones in the binary representation.
answered Sep 19, 2020 at 19:04
HamzaHamza
5,2353 gold badges27 silver badges42 bronze badges
The str.count method and bin function make short work of this little challenge:
>>> def ones(x):
"Count the number of ones in an integer's binary representation"
return bin(x).count('1')
>>> ones(20)
2
answered Mar 21, 2013 at 6:29
Raymond HettingerRaymond Hettinger
214k62 gold badges378 silver badges481 bronze badges
You can do this using bit shifting >>
and bitwise and &
to inspect the least significant bit, like this:
def count_ones(x):
result = 0
while x > 0:
result += x & 1
x = x >> 1
return result
This works by shifting the bits right until the value becomes zero, counting the number of times the least significant bit is 1 along the way.
answered Jan 29, 2020 at 16:00
I am a new coder and I found this one logic simple. Might be easier for newbies to understand.
def onesInDecimal(n):
count = 0
while(n!=0):
if (n%2!=0):
count = count+1
n = n-1
n = n/2
else:
n = n/2
return count
answered Jun 24, 2017 at 13:22
For a special case when you need to check quickly whether the binary form of the integer x
has only a single 1 (and thus is a power of 2), you can use this check:
if x == -(x | (-x)):
...
The expression -(x | (-x))
is the number that you get if you replace all 1s except the last one (the least significant bit) in the binary representation of x
with 0.
Example:
12 = 1100 in binary
-12 = …110100 in binary (with an infinite number of leading 1s)
12 | (-12) = …111100 in binary (with an infinite number of leading 1s)
-(12 | (-12)) = 100 in binary
answered Dec 27, 2021 at 23:35
1
If the input number is ‘number’
number =20
len(bin(number)[2:].replace('0',''))
Another solution is
from collections import Counter
Counter(list(bin(number))[2:])['1']
1
Способ 1.
str(4**255 + 2**255 - 255).count('1')
Приводим к строке, вызываем строковый метод подсчета символа.
Способ 2.
sum(1 for elem in bin(4**255+ 2**255 - 255)) if elem == '1')
Считаем количество единиц, так как функция bin переводит к строковому типу вида ‘0bxxx’, где xxx — цифры числа в двоичном представлении.
Способ 3.
Также существует несложный алгоритм.
4^255 = 2^(255 * 2)
степень двойки, будет обозначать единица в двоичном представлении данной суммы.
2^255
— аналогично.
С вычитанием интереснее, можно проследить следующую закономерность:
2^n - 2^m
— будет содержать n - m
единиц (проверьте это и докажите самостоятельно).
Отсюда сделаем следующий финт: -255 = -256 + 1 = -2^8 + 2^0
В итоге наше выражение: 2^(255 * 2) + 2^255 - 2^8 + 1
будет иметь 1 + (255 - 8) + 1
единицу, так как 2^255 - 2^8
четное число и значит нулевой бит у него будет нулевой и прибавление единицы добавит только единицу.
DeaZZZlee 1 / 1 / 0 Регистрация: 23.02.2020 Сообщений: 24 |
||||
1 |
||||
Сколько единиц в бинарной записи?[РЕШЕНИЕ]27.04.2020, 13:42. Показов 35172. Ответов 8 Метки python, python 3.7 (Все метки)
Сколько 1 в бинарной записи числа Входные данные: Целое неотрицательное число K. Выходные данные: Сколько единиц содержит бинарная запись числа. Примеры Вход Выход Решение:
Доработайте,если кому интересно или кто ищет — возьмите.
0 |
u235 4383 / 2492 / 526 Регистрация: 07.11.2019 Сообщений: 4,137 |
||||
27.04.2020, 17:15 |
2 |
|||
2 |
1 / 1 / 0 Регистрация: 23.02.2020 Сообщений: 24 |
|
27.04.2020, 17:49 [ТС] |
3 |
Так раздел вроде для начинающих,типо подобный сахар новичкам вроде как ни к чему.
0 |
5889 / 3347 / 1033 Регистрация: 03.11.2009 Сообщений: 9,974 |
|
27.04.2020, 17:57 |
4 |
потому что
2 |
u235 |
27.04.2020, 19:29
|
Не по теме: Jabbson, это же про Форт.
0 |
1728 / 967 / 199 Регистрация: 22.02.2018 Сообщений: 2,694 Записей в блоге: 6 |
|
27.04.2020, 21:57 |
6 |
Так раздел вроде для начинающих,типо подобный сахар новичкам вроде как ни к чему Так это задача и вариант ее решения, который дал u235, для новичков. Функции bin и count это все из базовых знаний необходимых новичкам.
1 |
5889 / 3347 / 1033 Регистрация: 03.11.2009 Сообщений: 9,974 |
|
27.04.2020, 22:04 |
7 |
А Ваше решение из серии как простую задачу превратить в сложную. или ‘как решить задачу на си, используя синтаксис питона’
0 |
iSmokeJC Am I evil? Yes, I am! 16256 / 9012 / 2605 Регистрация: 21.10.2017 Сообщений: 20,715 |
||||
27.04.2020, 22:20 |
8 |
|||
Jabbson, не! Как решить задачу питона, использовав синтаксис си. Бугаг
1 |
flash_back 20 / 20 / 20 Регистрация: 07.02.2016 Сообщений: 87 |
||||
11.02.2021, 11:54 |
9 |
|||
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
11.02.2021, 11:54 |
Помогаю со студенческими работами здесь Посчитать сколько единиц есть в записи числа в двоичной системе счисления Число X перевели из десятичной в двоичную систему счисления.Сколько единиц получилось в двоичной записи числа? Найти следующее число, в двоичной записи которого столько же единиц, сколько и в двоичном представлении числа N [NASM] Определить, в каком из трёх чисел единиц больше единиц в двоичной записи Определить количество единиц в цифровой записи числа, кроме единиц в младших разрядах После бинарной записи файл всё равно остаётся пустым Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 9 |
При помощи операции нахождения остатка и целочисленного деления можно достаточно несложно вычислить любую цифру числа.
Рассмотрим программу получения цифр двузначного числа:
num = 17
a = num % 10
b = num // 10
print(a)
print(b)
Результатом выполнения программы будут два числа:
7
1
То есть сначала мы вывели последнюю цифру числа, а затем первую цифру.
Запомни: последняя цифра числа определяется всегда как остаток от деления числа на 10 (% 10)
. Чтобы отщепить последнюю цифру от числа, необходимо разделить его нацело на 10 (// 10)
.
Рассмотрим программу получения цифр трёхзначного числа:
num = 754
a = num % 10
b = (num % 100) // 10
c = num // 100
print(a)
print(b)
print(c)
Результатом выполнения программы будут три числа:
4
5
7
То есть сначала мы вывели последнюю цифру числа, затем среднюю цифру, а затем первую цифру.
Алгоритм получения цифр n-значного числа
Несложно понять, по какому алгоритму можно найти каждую цифру n-значного числа num
:
- Последняя цифра:
(num % 101) // 100
; - Предпоследняя цифра:
(num % 102) // 101
; - Предпредпоследняя цифра:
(num % 103) // 102
; - …..
- Вторая цифра:
(num % 10n-1) // 10n-2
; - Первая цифра:
(num % 10n) // 10n-1
.
Решение задач
Задача 1. Напишите программу, определяющую число десятков и единиц в двузначном числе.
Решение. Число единиц – это последняя цифра числа, число десятков – первая цифра. Чтобы получить последнюю цифру любого числа, нужно найти остаток от деления числа на 10. Чтобы найти первую цифру двузначного числа, нужно поделить число нацело на 10. Программа, решающая поставленную задачу, может иметь следующий вид:
num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Число десятков =', first_digit)
print('Число единиц =', last_digit)
Задача 2. Напишите программу, в которой рассчитывается сумма цифр двузначного числа.
Решение. Программа, решающая поставленную задачу, может иметь следующий вид:
num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Сумма цифр =', last_digit + first_digit)
Задача 3. Напишите программу, которая печатает число, образованное при перестановке цифр двузначного числа.
Решение. Программа, решающая поставленную задачу, может иметь следующий вид:
num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Искомое число =', last_digit * 10 + first_digit)
Задача 4. Напишите программу, в которую вводится трёхзначное число и которая выводит на экран его цифры (через запятую).
Решение. Программа, решающая поставленную задачу, может иметь следующий вид:
num = int(input())
digit3 = num % 10
digit2 = (num // 10) % 10
digit1 = num // 100
print(digit1, digit2, digit3, sep=',')
Вопрос:
Как вы рассчитываете количество единиц в заданном двоичном представлении целого числа.
Скажем, вам присвоено число 20
, которое 10100
в двоичном формате, поэтому число единиц равно 2.
Лучший ответ:
Используйте awesome collections
модуль.
>>> from collections import Counter
>>> binary = bin(20)[2:]
>>> Counter(binary)
Counter({'0': 3, '1': 2})
Или вы можете использовать встроенную функцию count()
:
>>> binary = bin(20)[2:]
>>> binary.count('1')
2
Или даже:
>>> sum(1 for i in bin(20)[2:] if i == '1')
2
Но последнее решение медленнее, чем при использовании count()
Ответ №1
То, что вы ищете, называется весом Хэмминга, и для этого существует множество алгоритмов. Вот еще один простой:
def ones(n):
w = 0
while (n):
w += 1
n &= n - 1
return w
Ответ №2
>>> num = 20
>>> bin(num)[2:].count('1')
2
Ответ №3
Обычный способ быстро сделать это ослепительно – использовать таблицы поиска:
table = [bin(i)[2:].count('1') for i in range(256)]
def pop_count(n):
cnt = 0
while n > 0:
cnt += table[n & 256]
n >>= 8
return cnt
В Python любое решение с использованием bin
и list.count
будет быстрее, но это хорошо, если вы хотите записать его на ассемблере.
Ответ №4
str.count и bin функция делает короткую работу этой небольшой задачей:
>>> def ones(x):
"Count the number of ones in an integer binary representation"
return bin(x).count('1')
>>> ones(20)
2
Ответ №5
Если номер входа – ‘номер’
number =20
len(bin(number)[2:].replace('0',''))
Другим решением является
from collections import Counter
Counter(list(bin(number))[2:])['1']
Ответ №6
Я новый кодер, и я нашел эту логику простой. Возможно, легче понять новичков.
def onesInDecimal(n):
count = 0
while(n!=0):
if (n%2!=0):
count = count+1
n = n-1
n = n/2
else:
n = n/2
return count