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
| это не под мк? Тогда конечно. Я то думал ардуины. | | |
16
- 10.03.2016 - 17:57
| Цитата:
| |
| Интернет-форум Краснодарского края и Краснодара |