|
|
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Всем привет! Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:19:38 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Чуть не забыл - разрядность 32 бита, если важно. Тип int (отрицательные и положительные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:21:37 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+2 пишет: > Автор: +2 > Всем привет! > > Вопрос такого плана - можно ли узнать количество единиц в двоичном > представлении числа не используя поразрядный сдвиг с накоплением > переноса? Если да, то как? ну дели на два :) что мне всегда в вузе не нравилось - "вводные". то нельзя это нельзя. я люблю так. вот проблема - вот решение. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:27:59 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Ок. Есть последовательность {m, ... -2, -1, 0, 1, 2 ... n}. Надо узнать распределение чисел по числу единиц их двоичного представления. Напрашивается вариант перебора с вычислением количества единиц сдвигом с переносом для каждого числа, но это не рационально, так как при m, равном, например, -2000000000 и n = 2000000000 сожрет массу памяти и займет массу времени. Есть у кого мысли по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:37:13 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Хмм... массу памяти, конечно, не сожрет, но времени, я подозреваю, уйдет просто немеряно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:39:28 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Если еще точнее, то мне надо набор чисел отсортировать сначала по количеству единиц двоичного представления, внутри каждой группы - в порядке возрастания, после чего выбрать всего одно - по его порядковому номеру в получившемся массиве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:46:40 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+2Вопрос такого плана - можно ли узнать количество единиц в двоичном представлении числа не используя поразрядный сдвиг с накоплением переноса? Если да, то как?Само по себе это несложно. Как достаточно быстрый вариант - с помощью заранее подготовленного массив из 256 или 65536 чисел с нужными суммами. Но для решения полной задачи простым перебором все равно может понадобиться уйма времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:50:28 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Построй таблицу размерностью 256 и для каждого индекса от 0 до 255 запиши в таблицу число единиц в этом числе. Далее пройдись по всем байтам исходного числа и в сумме получишь число единиц в бинарном представлении числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 16:53:54 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковУже лучше. Спасибо. Может еще мысли у кого есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:01:14 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:01:14 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+2 wrote: > Хмм... массу памяти, конечно, не сожрет Ещё как сожрет. 4 гигабайта оперативки, при указанном вами значении +- 2000000000.А вот по времени, мне кажется затраты не такими огромными будут. > Напрашивается вариант перебора с вычислением количества единиц сдвигом с переносом для каждого числа, но это не рационально, Не обязательно именно так делать. Можно создать счетчик на каждое число, и обратить внимание, что единица в каждом разряде появляется и исчезает периодически, начиная с нуля. Т.е. 00001 появляется и исчезает каждое число. 0010 появляется и исчезает каждые два числа. 0100 - каждые четыре, и т.д. Можно просто составить здоровенный массив и 32 раза по нему пробежаться, увеличивая значение в нужных счетчиках. А сортировать лучше уже потом, hash sort'ом или quick sort'ом - ИМХО, просто быстрее будет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:04:12 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Круть, пять баллов! :) А я вот что нашел: The On-Line Encyclopedia of Integer Sequences ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 17:10:32 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Что-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:12:36 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:27:30 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
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.] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2007, 18:58:01 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
terasЧто-то я не понял, что все-таки нужно - найти распределение или отсортировать? Это очень разные вещи. Чтобы найти распределение перебор необязателен. А в сортировке - от перебора никуда не денешься. Нужно по номеру элемента в последовательности подобной A047869 , но для 32-битного целого найти значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 00:57:44 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+2в последовательности подобной A047869 , но для 32-битного целого найти значение. Точнее, не именно в такой, а начинающейся с конкретного значения (например, 35) и завершающейся конкретным значением (например, 81). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 01:02:17 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 01:52:14 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
teras wrote: > Дальше можно заметить три интересных свойства: > 1) Рекуррентность полуинтервала. Возьмём n чисел, где n - степень > двойки. Разделим на две части - 0..n/2-1 и n/2..n. Пусть нам известно ммм. Второй - до n-1, конечно. На второй взгляд, больше косяков не нашел. :-) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 02:02:39 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
Я тут уже в теорию наборов углубился.. или как правильно перевести 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)) - может есть смысл разбить большую последовательность на кучу мелких? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 03:06:55 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
MasterZiv О, вспомнил ты этот хак, да ? Это из "Алгоритмические трюки для программистов", так ведь ? а на копирайты что никто не смотрит ? не думаешь же ты что я сам до такого додумался ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 09:18:00 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+2 wrote: > Автор: +2 > Я тут уже в теорию наборов углубился.. или как правильно перевести set > theory? По-моему очень похожая проблема. Теория множеств. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 10:27:04 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 12:04:07 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
int a=2837; int counter=0; while (a) { a = a&(a-1); counter++; } в counter-число единиц ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 12:17:37 |
|
||
|
Число единиц в двоичном представлении числа
|
|||
|---|---|---|---|
|
#18+
+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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2007, 13:01:47 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34859172&tid=2028005]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
199ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 209ms |
| total: | 521ms |

| 0 / 0 |
