1 (изменено: VovanKaban, 2013-01-17 03:06:24)

Тема: AHK: Перевод десятичных чисел в двоичную систему счисления

Подскажите функцию(процедуру) или готовый скрипт перевода
десятичных чисел в двоичную систему счисления.

Спасибо за ответ.

РС. поиском пользовался. К сожалению по запросу система счисления, двоичная.. и прочих ничего не нашел.

2

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

VovanKaban, ознакомься с этой темой, отредактируй свой пост.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

ToBin(Number)
{
   while n := Number >> (A_Index - 1)
      bin := n&1 . bin
   return bin
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

Красивый код. То, что нужно. Проверил работает.
Если бы писал сам вышло бы на пол страницы.
Огромное спасибо.
РС. хотя если честно не совсем понял код.
Алгоритм нахождения числа делением на два и записыванием остатка мне знаком,
но значки >>, n&1 . bin  - меня приводят в замешательство.

5

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

На самом деле точнее нужно так:

ToBin(Number)
{
   PrevFormat := A_FormatInteger
   SetFormat, IntegerFast, D
   
   while n := Number >> (A_Index - 1)
      bin := n&1 . bin
   
   SetFormat, IntegerFast, % PrevFormat
   return bin
}
VovanKaban пишет:

но значки >>, n&1 . bin  - меня приводят в замешательство.

>>
&
bin — просто переменная.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

Модератор бдит
Немного не успел выложить свой вариант. Добавлю до  кучи, тем более он  схож с первоначально предложеным, разве что чуть проще запись и меньше переменных ))

dec2bin(N)
{
   While N
      A := N&1 . A , N //= 2
   return A
}

7

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

Irbis пишет:

меньше переменных

Просто почему-то подумал, что с параметром функции нельзя производить операций .
Сдвиг лучше, чем деление (теоретически быстрее выполняется).
Функция переводит не только 10-тичные, но и 16-ричные.
Ну и о возможном 16-ричном формате записи чисел не нужно забывать!

SetFormat, integer, H
MsgBox, % ToBin(0xFF)

ToBin(Number)
{
   Loop
      bin := (Number&1 ? 1 : 0) . bin
   until !(Number >>= 1)
   Return bin
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

Сдвиг лучше, чем деление (теоретически быстрее выполняется).

— Если оперировать машинным кодом.

Autohotkey собирается актуальной версией Visual Studio, что-то мне подсказывает, что математические операции в интерпретаторе уже оптимизированы.

9 (изменено: Irbis, 2013-01-17 12:46:43)

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

teadrinker пишет:

Ну и о возможном 16-ричном формате записи чисел не нужно забывать!

Так оно и так по умолчанию работает. http://resources.pokerstrategy.com/smileys/confused.gif
Можно и без SetFormat, integer, H в моем примере записать

MsgBox % dec2bin(0x1A)

И получить правильный ответ.

Конечно, если "где-то, там.." вывод меняется на 16-ричный, можно обвешивать функцию всякими дополнительными проверками и условиями. Врял ли ТС'у нужна чересчур продвинутая функциональность от скрипта "на 1 раз".
А то так можно дойти до предположений, к примеру, а что если он не может прочитать ответ с экрана, и озвучивать его морзянкой? 1 - длинный сигнал, 0 - короткий

10

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

Irbis пишет:

Так оно и так по умолчанию работает.

В смысле?

SetFormat, Integer, H
MsgBox, % dec2bin(256)

dec2bin(N)
{
   While N
      A := N&1 . A , N //= 2
   return A
}
Irbis пишет:

Конечно, если "где-то, там.." вывод меняется на 16-ричный

Ну, не знаю, обычно такие вещи принято учитывать (так же, как и состояние A_DetectHiddenWindows, например). Сам не раз имел с этим проблемы.

creature.ws пишет:

Сдвиг лучше, чем деление (теоретически быстрее выполняется).

— Если оперировать машинным кодом..

Действительно, проверил — одинаково получается.

Обратный перевод:

SetFormat, integer, H      ; просто для проверки
MsgBox, % FromBin("1010101111001101")   ; обязательно в кавычках

FromBin(bin)
{
   Loop, parse, bin
      Num := (Num ? Num << 1 : 0)|A_LoopField
   Return Num
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Перевод десятичных чисел в двоичную систему счисления

"По умолчанию" имелось в виду, что изначально скрипт работает с десятичным представлением чисел, и команда SetFormat не применяется для его смены. Разумеется, Ваш вариант более универсален.