Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Число единиц в двоичном представлении числа / 25 сообщений из 42, страница 1 из 2
09.10.2007, 16:19:38
    #34857488
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Всем привет!

Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как?
...
Рейтинг: 0 / 0
09.10.2007, 16:21:37
    #34857503
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Чуть не забыл - разрядность 32 бита, если важно. Тип int (отрицательные и положительные)
...
Рейтинг: 0 / 0
09.10.2007, 16:27:59
    #34857535
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
+2 пишет:
> Автор: +2
> Всем привет!
>
> Вопрос такого плана - можно ли узнать количество единиц в двоичном
> представлении числа не используя поразрядный сдвиг с накоплением
> переноса? Если да, то как?
ну дели на два :)
что мне всегда в вузе не нравилось - "вводные". то нельзя это нельзя.
я люблю так. вот проблема - вот решение.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.10.2007, 16:37:13
    #34857585
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Ок. Есть последовательность {m, ... -2, -1, 0, 1, 2 ... n}. Надо узнать распределение чисел по числу единиц их двоичного представления. Напрашивается вариант перебора с вычислением количества единиц сдвигом с переносом для каждого числа, но это не рационально, так как при m, равном, например, -2000000000 и n = 2000000000 сожрет массу памяти и займет массу времени. Есть у кого мысли по этому поводу?
...
Рейтинг: 0 / 0
09.10.2007, 16:39:28
    #34857597
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Хмм... массу памяти, конечно, не сожрет, но времени, я подозреваю, уйдет просто немеряно.
...
Рейтинг: 0 / 0
09.10.2007, 16:46:40
    #34857643
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Если еще точнее, то мне надо набор чисел отсортировать сначала по количеству единиц двоичного представления, внутри каждой группы - в порядке возрастания, после чего выбрать всего одно - по его порядковому номеру в получившемся массиве.
...
Рейтинг: 0 / 0
09.10.2007, 16:50:28
    #34857666
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
+2Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как?Само по себе это несложно. Как достаточно быстрый вариант - с помощью заранее подготовленного массив из 256 или 65536 чисел с нужными суммами.
Но для решения полной задачи простым перебором все равно может понадобиться уйма времени.
...
Рейтинг: 0 / 0
09.10.2007, 16:53:54
    #34857685
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Построй таблицу размерностью 256 и для каждого индекса от 0 до 255 запиши в таблицу число единиц в этом числе. Далее пройдись по всем байтам исходного числа и в сумме получишь число единиц в бинарном представлении числа.
...
Рейтинг: 0 / 0
09.10.2007, 17:01:14
    #34857722
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Анатолий ШироковУже лучше. Спасибо. Может еще мысли у кого есть?
...
Рейтинг: 0 / 0
09.10.2007, 17:01:14
    #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
09.10.2007, 17:04:12
    #34857742
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
+2 wrote:

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

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

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

А я вот что нашел: The On-Line Encyclopedia of Integer Sequences
...
Рейтинг: 0 / 0
09.10.2007, 18:12:36
    #34858025
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
Что-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься.
...
Рейтинг: 0 / 0
09.10.2007, 18:27:30
    #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
09.10.2007, 18:58:01
    #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
10.10.2007, 00:57:44
    #34858752
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
terasЧто-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься.

Нужно по номеру элемента в последовательности подобной A047869 , но для 32-битного целого найти значение.
...
Рейтинг: 0 / 0
10.10.2007, 01:02:17
    #34858757
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
+2в последовательности подобной A047869 , но для 32-битного целого найти значение.
Точнее, не именно в такой, а начинающейся с конкретного значения (например, 35) и завершающейся конкретным значением (например, 81).
...
Рейтинг: 0 / 0
10.10.2007, 01:52:14
    #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
10.10.2007, 02:02:39
    #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
10.10.2007, 03:06:55
    #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
10.10.2007, 09:18:00
    #34858955
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
MasterZiv
О, вспомнил ты этот хак, да ? Это из "Алгоритмические трюки для программистов",
так ведь ?


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

Теория множеств.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.10.2007, 12:04:07
    #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
10.10.2007, 12:17:37
    #34859745
test_2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число единиц в двоичном представлении числа
int a=2837;
int counter=0;
while (a) {
a = a&(a-1);
counter++;
}

в counter-число единиц ...
...
Рейтинг: 0 / 0
10.10.2007, 13:01:47
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Число единиц в двоичном представлении числа / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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