bases

Conversão de bases numéricas não é lá um tema muito interessante, mas vou postar algumas rotinas para isso:

;função que converte inteiro para a base selecionada:
(defun i2base  (n letras / lst u ex base)
  (
setq lst  nil
        ex   0
        n    (fix n)
        base (float (length letras)));inteiros grandes...
  (while (not (equal n 0.0 0.0001))
    (
setq u   (fix (rem (/ n (expt base ex)) base))
          lst (append lst (list u))
          n   (- n (* u (expt base ex)))
          ex  (1+ ex)))
  (
setq
    ex (apply 'strcat
              (reverse (mapcar '(lambda (x)
                                  (
nth x letras))
                               lst))))
  (
if (equal "" ex)
    (
car letras)
    ex))

;converte base para inteiro:
(defun base2i  (str letras / n ex st1 u base)
  (
setq ex   (1- (strlen str))
        n    0
        base (float (length letras)));inteiros grandes...
  (while (/= str "")
    (
setq st1 (substr str 1 1)
          str (vl-string-subst "" st1 str)
          u   (vl-position st1 letras)
          n   (+ n (* u (expt base ex)))
          ex  (1- ex)))
  n)

;inteiro para base 26 (+ou- como o excel)
(defun i2b26 (n)
  (
i2base n
          '("0" "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K"
           "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W"
               "X" "Y" "Z"
)))

;transforma handle em numero (base 16 -> base 10)
(defun h2r  (str / n ex st1 u)
  (
base2i str
    '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
      "A" "B" "C" "D" "E" "F"
)))

; transforma numero em handle (base 10 -> base 16)
(defun r2h  (n / lst u ex)
  (
i2base n
    '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
      "A" "B" "C" "D" "E" "F"
)))

Isto definirá as funções:
I2BASE inteiro -> base (ex.: (i2base 100 '( "A" "B" "C")) retorna: "BACAB")
BASE2I base -> inteiro (ex.: (base2i "BACAB" '("A" "B" "C")) retona: 100)
I2B26 inteiro -> base 26 (ex.: (i2b26 1000) retorna: "AJA")
H2R base 16 -> inteiro (ex:.: (h2r "ABCD") retorna: 43981)
R2H inteiro -> base 16 (ex.: (r2h 123456) retorna: "1E240")

Nenhum comentário:

Postar um comentário