Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Помощь в коде С#, создание массива (http://forums.kuban.ru/f1024/pomosh-_v_kode_s_sozdanie_massiva-7576319.html)

Перпетум Мобиле 04.03.2016 19:43

Помощь в коде С#, создание массива
 
нужно из произвольного числа 32 битного создать массив значений.
длина массива = количеству 1 в двоичном представлении числа
значения массива положение бита в числе, 0 бит если 1 то значение 1.
3-й бит значение 4 и т.д.

Например число 00011001111110111111000111011010 (младший бит справа, 20 ебениц)

На выходе int[] {2,4,5,7,8,9 и т.д.** длиной 20

Уже всю голову сломал как это красиво сделать ?

fanatnascar 06.03.2016 10:24

Цикл, операция сравнения для понимания значения бита.
Первый цикл выясняет размерность, второй заполняет массив.
Динамические массивы в си (по крайней мере для мк) - зло. Лучше создать статический максимальной размерности.

fanatnascar 06.03.2016 10:27

var bit = (b & (1 << bitNumber-1)) != 0;

Перпетум Мобиле 06.03.2016 11:08

ну примерно так и поступил. Двумя циклами. просто сперва думал, что можно как-то красивее одним циклом.
В принципе можно, но фигня получалась.... хотя....

Перпетум Мобиле 06.03.2016 11:34

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

fanatnascar 06.03.2016 11:38

4-Перпетум Мобиле >ванную, что двумя отрабатывает быстрее, а со статикой, когда нет нужды ковыряться с размерами, еще быстрее)

Ну а если нужен реальный размер - храни его в отдельной uint8 переменной, формируя в том же одном цикле.

fanatnascar 06.03.2016 11:39

Вангую*
Ондроед)

Перпетум Мобиле 06.03.2016 11:45

Нифига не быстрее, у меня число может быть от 1 до 24 бит заполнения. Один код нашел, который выполняет строго 13 вычислений и на выходе дает количество единиц в числе.
Другой код нашел, который работает в цикле и выполняется столько, сколько единиц в числе, то есть при 13 шт, выполнится цикл 13 раз, при 3-х - 3 раза. В общем 50/50 относительно первому коду.
А еще надо выполнить проверку на биты и запись в массив, который будет выполняться до 24 раз, если будут выставлены все 24 бита.
Так как проверку на выставленный бит выполнять один фиг, записывать в массив значение один фиг, почему не менять размерность массива и на выходе не получить его длину ? то есть тем самым узнаем сколько бит выставленно.

Не сванговал, пишу драйвер опроса прибора для scada

Перпетум Мобиле 06.03.2016 11:47

поправка, проверка на биты будет выполняться все равно 24 раза, если 24-й бит выставлен в 1, а остальное нули.
Вот эту бы процедуру как-нить сократить но кажется это анриал или приведет к увеличению кода.

40KHYTbIU 07.03.2016 00:36

Альтернативный:

1. Создаем сортированный массив чисел представляющих значение одного бита: 0 1 2 4 8 16 32 64 128 256 и тд.
2. Ищем в массиве максимальное число равное или меньшее числу.
3. Кладем в стек индекс числа из 2 в стек, это последний индекс бита 1.
4. Вычитаем число из п.2 от исходного числа, для результата большего 0 повторяем шаги 2-4
5. Вытаскиваем номера битов из стека

Перпетум Мобиле 07.03.2016 09:23

9-40KHYTbIU > запутал, кодом можно ?

40KHYTbIU 07.03.2016 12:44

[url]https://codeshare.io/0CGXI[/url]

Шарпов не знаю, так что жава. Есть некая магия стандартный библиотек, гуглится легко =) Ссылка будет жить две недели ;)

Перпетум Мобиле 07.03.2016 20:21

11-40KHYTbIU > спасибо, попробую разобраться и конвертнуть для шарпа.
Код действительно не выглядит большим.

Marr 09.03.2016 18:03

А что за задача стояла?

Перпетум Мобиле 09.03.2016 21:38

13-Marr > определение количества включенных каналов прибора и распихивание входящих от него данных в соответствии с каналами.

fanatnascar 10.03.2016 17:55

[quote=Перпетум Мобиле;41578052]Не сванговал, пишу драйвер опроса прибора для scada[/quote]
это не под мк? Тогда конечно.
Я то думал ардуины.

fanatnascar 10.03.2016 17:57

[quote=40KHYTbIU;41581845] Альтернативный: 1. Создаем сортированный массив чисел представляющих значение одного бита: 0 1 2 4 8 16 32 64 128 256 и тд. 2. Ищем в массиве максимальное число равное или меньшее числу. 3. Кладем в стек индекс числа из 2 в стек, это последний индекс бита 1. 4. Вычитаем число из п.2 от исходного числа, для результата большего 0 повторяем шаги 2-4 5. Вытаскиваем номера битов из стека [/quote]

магия! ))


Текущее время: 04:26. Часовой пояс GMT +3.