Как посчитать количество единиц в двоичном числе питон

от admin

Подсчёт количества едениц в строке

Сколько единиц содержится в двоичной записи значения выражения: 4^255 + 2^255 − 255?

Что не так? И пожалуйста объясните.

Lary's user avatar

Способ 1.

Приводим к строке, вызываем строковый метод подсчета символа.

Способ 2.

Считаем количество единиц, так как функция bin переводит к строковому типу вида ‘0bxxx’, где xxx — цифры числа в двоичном представлении.

Способ 3.

Также существует несложный алгоритм.

4^255 = 2^(255 * 2) степень двойки, будет обозначать единица в двоичном представлении данной суммы.

С вычитанием интереснее, можно проследить следующую закономерность:

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 четное число и значит нулевой бит у него будет нулевой и прибавление единицы добавит только единицу.

Есть ли в python встроенная функция для подсчета количества единиц в числе? [закрыто]

Предложите эффективный алгоритм, если такой библиотечной функции не существует.

задан 24 сен ’12, 11:09

Математически в любом «числе» есть «число» единиц. — Preet Sangha

Я предполагаю, что вы говорите о количестве единиц в представлении числа в определенной системе счисления. Десятичный наверное? Или бинарный? Оба являются общими, и другие возможны. — user395760

Правильным термином будет «цифры». «Считай 1 цифры в числе» будет более четким способом выразить ваш вопрос. — Martijn Pieters

Если вы имеете в виду подсчет единиц в двоичном представлении числа, взгляните на это вопрос. — Lauritz V. Thaulow

3 ответы

что-то вроде str(number).count(«1») ?

Конечно, это при условии, что OP говорит о десятичной системе (вес Хэмминга, относящийся к двоичной системе, довольно распространен). — пользователь395760

Действительно, но я предполагаю, что это то, чего хочет ОП, поскольку нет информации, чтобы утверждать это — это может быть неправильно, если ОП когда-либо прояснит вопрос. — джсбуэно

Или мы могли бы просто отказаться отвечать на плохие вопросы вместо того, чтобы гадать. — Вубл

Получите количество нулей и единиц двоичного числа в Python

Я пытаюсь решить двоичную головоломку, моя стратегия — преобразовать сетку в нули и единицы, и я хочу убедиться, что каждая строка имеет такое же количество 0 и 1.

Есть ли какой-либо способ подсчета количества 1 и 0 числа, не прошедшего через номер?

То, что я сейчас делаю, это:

Есть ли более эффективный вычислительный (или математический способ) этого?

Если length умеренная (например, менее 20), вы можете использовать список в качестве справочной таблицы.

Стоит только генерировать список, если вы делаете много поисков, но, похоже, вы можете в этом случае.

например. Для 16-разрядной таблицы из 0 используйте этот

20 бит по-прежнему занимает менее секунды, чтобы сгенерировать на этом компьютере

Подсчитайте количество единиц в двоичном представлении

эффективный способ подсчета числа 1s в двоичном представлении числа в O (1), Если у вас достаточно памяти для игры. Это вопрос интервью, который я нашел на онлайн-форуме, но у него не было ответа. Может кто-нибудь предложить что-то, я не могу придумать способ сделать это в O(1) Время?

21 ответов:

Это вес Хэмминга проблема, ака подсчет населения. Ссылка упоминает эффективные реализации. Цитирование:

с неограниченной памятью мы могли бы просто создать большую таблицу поиска веса Хэмминга каждого 64-битного целого числа

у меня есть решение, которое подсчитывает биты в O(Number of 1’s) время:

в худшем случае (когда число 2^n — 1, Все 1 в двоичном формате) он будет проверять каждый бит.

изменить: Просто нашел очень хороший алгоритм постоянного времени, постоянной памяти для bitcount. Вот оно, написано на C:

вы можете найти доказательство своей правоты здесь.

обратите внимание на то, что: n&(n-1) всегда устраняет наименее значимый 1.

следовательно, мы можем написать код для вычисления количества 1 следующим образом:

сложность программы будет: число 1 в n (которое постоянно

Я видел следующее решение с другого сайта:

Это будет самый короткий ответ в мою жизнь так: таблица подстановки.

видимо, мне нужно немного объяснить:» если у вас достаточно памяти, чтобы играть » означает, что у нас есть вся необходимая память (неважно, техническая возможность). Теперь вам не нужно хранить таблицу поиска более одного или двух байтов. Хотя технически это будет Ω(log(n)), а не O(1), просто чтение числа, которое вам нужно, — это Ω(log (n)), поэтому, если это проблема, то ответ, невозможно — что еще короче.

какой из двух ответов они ожидают от вас на интервью, никто не знает.

есть еще один трюк: в то время как инженеры могут взять число и говорить о Ω(log(n)), где n-число, компьютерные ученые скажут, что на самом деле мы должны измерять время работы как функцию a длина ввода, поэтому то, что инженеры называют Ω(log(n)), на самом деле Ω(k), где k-количество байтов. Тем не менее, как я уже говорил, просто чтение числа-это Ω(k), поэтому мы не можем сделать лучше этого.

функция принимает int и возвращает количество единиц в двоичном представлении

ниже приводится решение C с использованием битовых операторов:

следующее решение Java с использованием полномочий 2:

  1. мы можем просто подсчитать набор бит (1), используя __строение_popcount().

    int numOfOnes(int x)

  2. цикл через все биты в целое число, проверьте, если бит установлен, и если это затем увеличить переменную count.

    int hammingDistance(int x)

есть только один способ, который я могу придумать, чтобы выполнить эту задачу в O(1). то есть «обмануть» и использовать физическое устройство (с линейным или даже параллельным программированием я думаю, что предел-O(log(k)), где k представляет количество байтов числа).

однако вы можете очень легко представить себе физическое устройство, которое соединяет каждый бит с выходной линией с напряжением 0/1. Затем вы можете просто прочитать в электронном виде общее напряжение на линии «суммирования» в O(1). Это было бы вполне легко сделать эту основную идею более элегантной с некоторыми основными элементами схемы для получения выхода в любой форме, которую вы хотите (например, двоичный кодированный выход), но основная идея одна и та же, и электронная схема будет производить правильное состояние выхода в фиксированное время.

Я предполагаю, что есть также возможные возможности квантовых вычислений, но если нам позволят это сделать, я бы подумал, что простая электронная схема-это более простое решение.

Я на самом деле сделал это, используя немного ловкости рук: одной таблицы поиска с 16 записями будет достаточно, и все, что вам нужно сделать, это разбить двоичный rep на кусочки (4-битные кортежи). Сложность на самом деле O(1), и я написал шаблон C++, который был специализирован на размере целого числа, которое вы хотели (в # битах). делает его постоянным выражением вместо неопределенного.

fwiw вы можете использовать тот факт, что (i & — i) вернет вам LS один бит и просто цикл, зачистка выключайте lsbit каждый раз, пока целое число не станет нулем — но это старый трюк с четностью.

Я пришел сюда, имея большую веру, что я знаю красивое решение этой проблемы. Код в C:

но после того, как я провел небольшое исследование по этой теме (читайте другие ответы:)) я нашел 5 более эффективных алгоритмов. Люблю так!

есть даже инструкция CPU, разработанная специально для этой задачи: popcnt . (упоминается в ответ)

описание и бенчмаркинг многих алгоритмов вы можете найти здесь.

ниже метод может подсчитать количество 1s в отрицательных числах, а также.

однако число, подобное -1, представлено в двоичном виде как 1111111111111111111111111111111111 и поэтому потребует много сдвига. Если вы не хотите делать так много сдвигов для небольших отрицательных чисел, другой способ может быть следующим:

в python или любом другом преобразовании в строку bin затем разделите ее с помощью «0», чтобы избавиться от 0, затем объедините и получите длину.

С использованием строковых операций в JS можно сделать следующим образом:

или

Я должен был гольф это в Руби и в конечном итоге с

использование :

l[2**32-1] # returns 32

очевидно, не эффективно, но делает трюк 🙂

двумя способами:

где binaryValue-это двоичная строка, например: 1100

Читать:
Коды весового товара ут 11 где найти

Похожие статьи