![]() |
Помощь в коде С#, создание массива нужно из произвольного числа 32 битного создать массив значений. длина массива = количеству 1 в двоичном представлении числа значения массива положение бита в числе, 0 бит если 1 то значение 1. 3-й бит значение 4 и т.д. Например число 00011001111110111111000111011010 (младший бит справа, 20 ебениц) На выходе int[] {2,4,5,7,8,9 и т.д.** длиной 20 Уже всю голову сломал как это красиво сделать ? |
Цикл, операция сравнения для понимания значения бита. Первый цикл выясняет размерность, второй заполняет массив. Динамические массивы в си (по крайней мере для мк) - зло. Лучше создать статический максимальной размерности. |
var bit = (b & (1 << bitNumber-1)) != 0; |
ну примерно так и поступил. Двумя циклами. просто сперва думал, что можно как-то красивее одним циклом. В принципе можно, но фигня получалась.... хотя.... |
Точно блин, обошелся одним циклом, раз все равно проверять биты, то заодно и увеличиваем массив для записи и на выходе узнаем количество ебениц.... |
4-Перпетум Мобиле >ванную, что двумя отрабатывает быстрее, а со статикой, когда нет нужды ковыряться с размерами, еще быстрее) Ну а если нужен реальный размер - храни его в отдельной uint8 переменной, формируя в том же одном цикле. |
Вангую* Ондроед) |
Нифига не быстрее, у меня число может быть от 1 до 24 бит заполнения. Один код нашел, который выполняет строго 13 вычислений и на выходе дает количество единиц в числе. Другой код нашел, который работает в цикле и выполняется столько, сколько единиц в числе, то есть при 13 шт, выполнится цикл 13 раз, при 3-х - 3 раза. В общем 50/50 относительно первому коду. А еще надо выполнить проверку на биты и запись в массив, который будет выполняться до 24 раз, если будут выставлены все 24 бита. Так как проверку на выставленный бит выполнять один фиг, записывать в массив значение один фиг, почему не менять размерность массива и на выходе не получить его длину ? то есть тем самым узнаем сколько бит выставленно. Не сванговал, пишу драйвер опроса прибора для scada |
поправка, проверка на биты будет выполняться все равно 24 раза, если 24-й бит выставлен в 1, а остальное нули. Вот эту бы процедуру как-нить сократить но кажется это анриал или приведет к увеличению кода. |
Альтернативный: 1. Создаем сортированный массив чисел представляющих значение одного бита: 0 1 2 4 8 16 32 64 128 256 и тд. 2. Ищем в массиве максимальное число равное или меньшее числу. 3. Кладем в стек индекс числа из 2 в стек, это последний индекс бита 1. 4. Вычитаем число из п.2 от исходного числа, для результата большего 0 повторяем шаги 2-4 5. Вытаскиваем номера битов из стека |
9-40KHYTbIU > запутал, кодом можно ? |
[url]https://codeshare.io/0CGXI[/url] Шарпов не знаю, так что жава. Есть некая магия стандартный библиотек, гуглится легко =) Ссылка будет жить две недели ;) |
11-40KHYTbIU > спасибо, попробую разобраться и конвертнуть для шарпа. Код действительно не выглядит большим. |
А что за задача стояла? |
13-Marr > определение количества включенных каналов прибора и распихивание входящих от него данных в соответствии с каналами. |
[quote=Перпетум Мобиле;41578052]Не сванговал, пишу драйвер опроса прибора для scada[/quote] это не под мк? Тогда конечно. Я то думал ардуины. |
[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] магия! )) |
Текущее время: 11:27. Часовой пояс GMT +3. |