К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Помощь в коде С#, создание массива

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

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

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

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



Гость
1 - 06.03.2016 - 10:24
Цикл, операция сравнения для понимания значения бита.
Первый цикл выясняет размерность, второй заполняет массив.
Динамические массивы в си (по крайней мере для мк) - зло. Лучше создать статический максимальной размерности.
Гость
2 - 06.03.2016 - 10:27
var bit = (b & (1 << bitNumber-1)) != 0;
3 - 06.03.2016 - 11:08
ну примерно так и поступил. Двумя циклами. просто сперва думал, что можно как-то красивее одним циклом.
В принципе можно, но фигня получалась.... хотя....
4 - 06.03.2016 - 11:34
Точно блин, обошелся одним циклом, раз все равно проверять биты, то заодно и увеличиваем массив для записи и на выходе узнаем количество ебениц....
Гость
5 - 06.03.2016 - 11:38
4-Перпетум Мобиле >ванную, что двумя отрабатывает быстрее, а со статикой, когда нет нужды ковыряться с размерами, еще быстрее)

Ну а если нужен реальный размер - храни его в отдельной uint8 переменной, формируя в том же одном цикле.
Гость
6 - 06.03.2016 - 11:39
Вангую*
Ондроед)
7 - 06.03.2016 - 11:45
Нифига не быстрее, у меня число может быть от 1 до 24 бит заполнения. Один код нашел, который выполняет строго 13 вычислений и на выходе дает количество единиц в числе.
Другой код нашел, который работает в цикле и выполняется столько, сколько единиц в числе, то есть при 13 шт, выполнится цикл 13 раз, при 3-х - 3 раза. В общем 50/50 относительно первому коду.
А еще надо выполнить проверку на биты и запись в массив, который будет выполняться до 24 раз, если будут выставлены все 24 бита.
Так как проверку на выставленный бит выполнять один фиг, записывать в массив значение один фиг, почему не менять размерность массива и на выходе не получить его длину ? то есть тем самым узнаем сколько бит выставленно.

Не сванговал, пишу драйвер опроса прибора для scada
8 - 06.03.2016 - 11:47
поправка, проверка на биты будет выполняться все равно 24 раза, если 24-й бит выставлен в 1, а остальное нули.
Вот эту бы процедуру как-нить сократить но кажется это анриал или приведет к увеличению кода.
Гость
9 - 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. Вытаскиваем номера битов из стека
10 - 07.03.2016 - 09:23
9-40KHYTbIU > запутал, кодом можно ?
Гость
11 - 07.03.2016 - 12:44
https://codeshare.io/0CGXI

Шарпов не знаю, так что жава. Есть некая магия стандартный библиотек, гуглится легко =) Ссылка будет жить две недели ;)
12 - 07.03.2016 - 20:21
11-40KHYTbIU > спасибо, попробую разобраться и конвертнуть для шарпа.
Код действительно не выглядит большим.
Гость
13 - 09.03.2016 - 18:03
А что за задача стояла?
14 - 09.03.2016 - 21:38
13-Marr > определение количества включенных каналов прибора и распихивание входящих от него данных в соответствии с каналами.
Гость
15 - 10.03.2016 - 17:55
Цитата:
Сообщение от Перпетум Мобиле Посмотреть сообщение
Не сванговал, пишу драйвер опроса прибора для scada
это не под мк? Тогда конечно.
Я то думал ардуины.
Гость
16 - 10.03.2016 - 17:57
Цитата:
Сообщение от 40KHYTbIU Посмотреть сообщение
Альтернативный: 1. Создаем сортированный массив чисел представляющих значение одного бита: 0 1 2 4 8 16 32 64 128 256 и тд. 2. Ищем в массиве максимальное число равное или меньшее числу. 3. Кладем в стек индекс числа из 2 в стек, это последний индекс бита 1. 4. Вычитаем число из п.2 от исходного числа, для результата большего 0 повторяем шаги 2-4 5. Вытаскиваем номера битов из стека
магия! ))


К списку вопросов






Copyright ©, Все права защищены