Можно ли ускорить / упростить разложение суммы битов на составляющие?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Можно ли ускорить / упростить разложение суммы битов на составляющие?

Можно ли ускорить / упростить разложение суммы битов на составляющие?

Ответ
Поиск в этой теме
Непрочитано 31.10.2011, 22:13 #1
Можно ли ускорить / упростить разложение суммы битов на составляющие?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,406

Известно, что многие вещи удобно хранить как сумму некоторых битов (яркий пример тому - osmode).
Пока что у меня получилось следующее:
Код:
[Выделить все]
 (defun _eval-get-bit-summ (value bits /)
                                ;|
*    Получает список битов числа.
*    Параметры вызова:
	value		проверяемое значение. Неотрицательное целое.
	bits		список возможных битов. Можно неотсортированный.
*    Примеры вызова:
(_eval-get-bit-summ 129 '(1 2 4 8 16 32 64 128 2048 4096)) 	; '(128 1)
(_eval-get-bit-summ 30 '(1 2 4 8 16 32 64 128 2048 4096)) 	; '(16 8 4 2)
|;
  (vl-remove nil
             (mapcar
               (function
                 (lambda (x / tmp)
                   (if (and (/= value 0)
                            (>= value x)
                            (>= (rem x value) 0)
                            ) ;_ end of and
                     (setq tmp   x
                           value (- value x)
                           ) ;_ end of setq
                     ) ;_ end of if
                   tmp
                   ) ;_ end of lambda
                 ) ;_ end of function
               (vl-sort bits '>)
               ) ;_ end of mapcar
             ) ;_ end of vl-remove
  ) ;_ end of defun
Сильно подозреваю, что код неоптимален.
P.S. Пока нигде готового решения не искал, каюсь...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 3384
 
Непрочитано 31.10.2011, 22:36
1 | #2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Попробуй применить последовательно для элементов списка такую простую функцию:

Код:
[Выделить все]
 (defun ru-match-is-bit-in-flag (val flag)
    ;; (ru-match-bit-list 127)  => (64 32 16 8 4 2 1)  
    ;; (ru-match-is-bit-in-flag  8 127) => T   
    ;; (ru-match-is-bit-in-flag  128 127) => nil   
    (= (logand val flag) val)
) ;_ end of defun
или просто logand, если именно списком значений нужно
ShaggyDoc вне форума  
 
Непрочитано 31.10.2011, 23:04
1 | #3
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


думаю, как конечный результат, тебе нужен список переключателей, а не сумма возможных битов
Код:
[Выделить все]
 
(defun vk_Dec2Bin (Dec)
  (if (< Dec 2)
    (list Dec)
    (append (vk_Dec2Bin (/ Dec 2)) (list (rem Dec 2)))
  )
)
;;;и проверяешь типа
(if (= 1 (nth BitNum (reverse (vk_Dec2Bin BitSum))))
    (progn)
)
Vov.Ka вне форума  
 
Автор темы   Непрочитано 31.10.2011, 23:08
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Спасибо! Извините, что не сразу ответил.
ShaggyDoc, конечно же, logand! И ведь разбирался же я с ним, и как мог забыть? Спасибо!
Vov.Ka, благодарю, интересное решение!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.11.2011, 10:03
1 | #5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Я использую такую ф-цию
Код:
[Выделить все]
(defun bitset (A B)
  ;;; A - число сумма битов
  ;;; B - проверяемый бит (два в степени проверяемого бита)
  ;;; (bitset (+ 4 2) 4) ;_T
  (= (boole 1 A B) B))
Использование
Код:
[Выделить все]
(setq opt (+ 1 4 16))
(bitset opt 1) ;_ T
(bitset opt 2) ;_ nil
(bitset opt 4) ;_ T
(bitset opt 8) ;_ nil
(bitset opt 16) ;_ T
(bitset opt 32) ;_ nil
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Можно ли ускорить / упростить разложение суммы битов на составляющие?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, пожалуйста, можно ли ускорить рендирование в Автокаде. anmazarin AutoCAD 6 23.01.2009 15:30