powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Число единиц в двоичном представлении числа
25 сообщений из 42, страница 1 из 2
Число единиц в двоичном представлении числа
    #34857488
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Всем привет!

Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как?
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857503
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Чуть не забыл - разрядность 32 бита, если важно. Тип int (отрицательные и положительные)
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857535
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+2 пишет:
> Автор: +2
> Всем привет!
>
> Вопрос такого плана - можно ли узнать количество единиц в двоичном
> представлении числа не используя поразрядный сдвиг с накоплением
> переноса? Если да, то как?
ну дели на два :)
что мне всегда в вузе не нравилось - "вводные". то нельзя это нельзя.
я люблю так. вот проблема - вот решение.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857585
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Ок. Есть последовательность {m, ... -2, -1, 0, 1, 2 ... n}. Надо узнать распределение чисел по числу единиц их двоичного представления. Напрашивается вариант перебора с вычислением количества единиц сдвигом с переносом для каждого числа, но это не рационально, так как при m, равном, например, -2000000000 и n = 2000000000 сожрет массу памяти и займет массу времени. Есть у кого мысли по этому поводу?
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857597
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Хмм... массу памяти, конечно, не сожрет, но времени, я подозреваю, уйдет просто немеряно.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857643
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Если еще точнее, то мне надо набор чисел отсортировать сначала по количеству единиц двоичного представления, внутри каждой группы - в порядке возрастания, после чего выбрать всего одно - по его порядковому номеру в получившемся массиве.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857666
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+2Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как?Само по себе это несложно. Как достаточно быстрый вариант - с помощью заранее подготовленного массив из 256 или 65536 чисел с нужными суммами.
Но для решения полной задачи простым перебором все равно может понадобиться уйма времени.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857685
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Построй таблицу размерностью 256 и для каждого индекса от 0 до 255 запиши в таблицу число единиц в этом числе. Далее пройдись по всем байтам исходного числа и в сумме получишь число единиц в бинарном представлении числа.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857722
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Анатолий ШироковУже лучше. Спасибо. Может еще мысли у кого есть?
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857723
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
x = x - ((x>> 1 )& 0x55555555);
x = (x & 0x33333333) + ((x>> 2 )& 0x33333333);
x = (x+(x>> 4 ))& 0x0F0F0F0F;
x = x+(x>> 8 );
x = x+(x>> 16 );
x = x & 0x0000003F;

(с)
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857742
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+2 wrote:

> Хмм... массу памяти, конечно, не сожрет
Ещё как сожрет. 4 гигабайта оперативки, при указанном вами значении +-
2000000000.А вот по времени, мне кажется затраты не такими огромными
будут.

> Напрашивается вариант перебора с вычислением количества единиц сдвигом
с переносом для каждого числа, но это не рационально,

Не обязательно именно так делать. Можно создать счетчик на каждое число,
и обратить внимание, что единица в каждом разряде появляется и исчезает
периодически, начиная с нуля. Т.е. 00001 появляется и исчезает каждое
число. 0010 появляется и исчезает каждые два числа. 0100 - каждые
четыре, и т.д. Можно просто составить здоровенный массив и 32 раза по
нему пробежаться, увеличивая значение в нужных счетчиках. А сортировать
лучше уже потом, hash sort'ом или quick sort'ом - ИМХО, просто быстрее
будет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34857781
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Gluk (Kazan)
Круть, пять баллов! :)

А я вот что нашел: The On-Line Encyclopedia of Integer Sequences
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858025
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858089
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) пишет:

> x = x - ((x>>*1*)& 0x55555555);
> x = (x & 0x33333333) + ((x>>*2*)& 0x33333333);
> x = (x+(x>>*4*))& 0x0F0F0F0F;
> x = x+(x>>*8*);
> x = x+(x>>*16*);
> x = x & 0x0000003F;

О, вспомнил ты этот хак, да ? Это из "Алгоритмические трюки для программистов",
так ведь ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858174
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЭто из "Алгоритмические трюки для программистов" Похоже это очень старый и известный трюк. Вот что про него пишет Кнут в mmix-arith.w :

Here's a fun way to count the number of bits in a tetrabyte.
[This classical trick is called the ``Gillies--Miller method
for sideways addition'' in {\sl The Preparation of Programs
for an Electronic Digital Computer\/} by Wilkes, Wheeler, and
Gill, second edition (Reading, Mass.:\ Addison--Wesley, 1957),
191--193. Some of the tricks used here were suggested by
Balbir Singh, Peter Rossmanith, and Stefan Schwoon.]
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858752
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
terasЧто-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься.

Нужно по номеру элемента в последовательности подобной A047869 , но для 32-битного целого найти значение.
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858757
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
+2в последовательности подобной A047869 , но для 32-битного целого найти значение.
Точнее, не именно в такой, а начинающейся с конкретного значения (например, 35) и завершающейся конкретным значением (например, 81).
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858785
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+2 wrote:
> Автор: +2
> +2
> в последовательности подобной A047869
> <http://www.research.att.com/~njas/sequences/A047869>, но для 32-битного
> целого найти значение.
>
>
> Точнее, не именно в такой, а начинающейся с конкретного значения
> (например, 35) и завершающейся конкретным значением (например, 81).

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

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

Под распределением здесь я понимаю нечто близкое к понятию из теории
вероятности - количество чисел в интервале, имеющих 1, 2, ... n бит в
двоичном представлении. Можно представить его как массив счётчиков,
размеренностью от 0 до количества бит в слове.
Над распределением можно объявить операции сложения и вычитания -
складывая и вычитая соответствующие элементы двух распределений.

Дальше можно заметить три интересных свойства:
1) Рекуррентность полуинтервала. Возьмём n чисел, где n - степень
двойки. Разделим на две части - 0..n/2-1 и n/2..n. Пусть нам известно
распределение для первой половины. Тогда, для второй половины (там, где
добавляется старший бит) его можно вычислить, увеличив все элементы
распределения вплоть до позиции делящего бита первой половины на единицу.

2) Пусть дан интервал от m до n. Тогда можно рассчитать распределение
для интервала разделив его на две части - как сумму или разность
распределений двух не пересекающихся интервалов - например, от
(m..0)+(1..n), или (0..n)-(1..m). в зависимости от положения интервалов
относительно нуля.

3) Упорядоченность искомого числа относительно последовательного
просмотра интервалов. Проматривая интервалы последовательно, начиная с
распределения -(0..m) [это знак минус], и находя их распределения мы
можем отслеживать лежит ли искомое порядковое значение в рассматриваемом
интервале.

Свойства (1) и (2) позволяют рассчитать распределение для любого числа.
По ощущениям, требуемое время порядка - 1/2 O(n^2), где n - число бит в
представлении максимального числа. Подход еще не оптимален, но должно
быть гораздо быстрее перебора.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858788
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
teras wrote:
> Дальше можно заметить три интересных свойства:
> 1) Рекуррентность полуинтервала. Возьмём n чисел, где n - степень
> двойки. Разделим на две части - 0..n/2-1 и n/2..n. Пусть нам известно

ммм. Второй - до n-1, конечно. На второй взгляд, больше косяков не
нашел. :-)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858808
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
Я тут уже в теорию наборов углубился.. или как правильно перевести set theory? По-моему очень похожая проблема. Там всю последовательность (set) народ разбивает на поднаборы (subset of set) по количеству элементов набора (в моем случае, как раз получается 33 набора - от 0 до 32).
У меня получается, что первый набор содержит 1 элемент (0), второй - 32 элемента, третий - sum(1+2+3...+32) и т.д - есть некая закономерность. Так же проглядывается явная наклонность к увеличению количества элементов каждого последующего набора до середины последовательности (до 16-го набора), затем количество элементов с тем же шагом (?) убывает и 32-й набор содержит одну единственную запись -1 (1111 1111 1111 1111 1111 1111 1111 1111).
Вот такая вот картинка.
Как вычислить значение i-го элемента (для упрощения, допустим, первой - положительной половины последовательности) так для меня пока и остается загадкой, бум думать :\

Тут еще какая закономерность есть - если разбить 32 бита на две части по 16, то тогда очередной 32-х битный набор (допустим, из трех битов) мижно представить как объединение пересечений всех 16-битных наборов, сумма бит которых равна 3 (например, 1 + 2, 2 + 1, 0 + 3 и 3 + 0)) - может есть смысл разбить большую последовательность на кучу мелких?
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34858955
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
О, вспомнил ты этот хак, да ? Это из "Алгоритмические трюки для программистов",
так ведь ?


а на копирайты что никто не смотрит ?
не думаешь же ты что я сам до такого додумался ???
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34859172
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+2 wrote:
> Автор: +2
> Я тут уже в теорию наборов углубился.. или как правильно перевести set
> theory? По-моему очень похожая проблема.

Теория множеств.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34859673
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
terasТеория множеств.
Спасибо, я сразу после отправки того поста сам догадался :)

Вот я что еще тут заметил:

1. для n == 2^x в нулевом подмножестве находится одна запись (0), в первом - n записей, во втором - (n-1)*n/2 записей, в третьем пока думаю :)
2. для каждого (unsigned) подмножества x минимальное значение в этом подмножестве равно 2^x - 1
3. для каждого (unsigned) подмножества x максимальное значение в этом подмножестве равно 2^n - 2^(n-x)
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34859745
test_2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int a=2837;
int counter=0;
while (a) {
a = a&(a-1);
counter++;
}

в counter-число единиц ...
...
Рейтинг: 0 / 0
Число единиц в двоичном представлении числа
    #34859938
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+2 wrote:
>
> Вот я что еще тут заметил:
>
> 1. для n == 2^x в нулевом подмножестве находится одна запись (0), в
> первом - n записей, во втором - (n-1)*n/2 записей, в третьем пока думаю :)
> 2. для каждого (unsigned) подмножества x минимальное значение в этом
> подмножестве равно 2^x - 1
> 3. для каждого (unsigned) подмножества x максимальное значение в этом
> подмножестве равно 2^n - 2^(n-x)

А все-таки, если не трудно - что вы думаете о том, что я написал? Не
было времени, не оптимально, не подходит, не работает, не понятно?
Похоже, время я неправильно оценил - оно будет меньше. Пропорционально
количеству бит.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Число единиц в двоичном представлении числа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]