Что нового

[Данные, строки] Изменить формат представления числа из двоичной системы в 10-ую

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Столкнулся с необходимостью перевода изменения формата представления числа из двоичной системы в 10-ую и обратно.
Есть ли в AutoItе подобные ф-ии ?
Я не нашел и пришлось вернуться к изучению основ информатики.
Написал простенькие ф-ии :
Код:
#include <String.au3>
$bBin="10110110"
ConsoleWrite($bBin& @LF)
$iDec=BinToDec($bBin)
ConsoleWrite($iDec& @LF)
$bBin=DecToBin($iDec)
ConsoleWrite($bBin& @LF)
;========================================
Func BinToDec($b)
	$ilen=StringLen($b)
	Local $iRez=0
	For $i=1 To $ilen 
		$iI=StringMid($b,$i,1)
		$iRez+=$iI*2^($ilen-$i)
	Next 
	Return $iRez
EndFunc	
;========================================
Func DecToBin($iDec)
	Local $bRez
	Do
		$bb=Mod($iDec,2)
		$iDec=($iDec-$bb)/2
		$bRez&=$bb 
	Until $iDec<1
	Return _StringReverse($bRez)
EndFunc

и терзаюсь сомнениями не изобрел ли я велосипед ?
Может я плохо искал ? Просьба подсказать.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Re: [Математика] Перевод числа из двоичной системы в 10-ую

gregaz [?]
Столкнулся с необходимостью перевода числа из двоичной системы в 10-ую и обратно

поправка: числа не надо никуда переводить - число (как величина) одинаково в любой системе счисления, можно только менять форму его представления... т.е. задача имеет смысл только для строк, а не для чисел:

число -> строка (разрядность 1)
строка (разрядность 1) -> число -> строка (разрядность 2)

gregaz [?]
не изобрел ли я велосипед ?

ТУТ
что-то было
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
amel27 , спасибо
Теперь ясно ,что штатных средств нет.
В приведенной тобой ссылку сделано красивее ,конечно. Правда только в одну сторону
 

amel27

Продвинутый
Сообщения
146
Репутация
55
gregaz [?]
только в одну сторону

ну, способов можно много насочинять... например, такой изврат:

Код:
$a="01101010101010101010101010101010"
ConsoleWrite(_StringBin2Dec($a) &@CRLF)

Func _StringBin2Dec($sBin)
  Local $sRegL = StringRegExpReplace($sBin,".(?=.)","BitOR(BitRotate(")
  Local $sRegR = StringRegExpReplace($sBin,"(?<=.)(.)",",1,'D'),$1)")
  Return Execute(StringTrimRight($sRegL,1) & $sRegR)
EndFunc


:smile:
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
amel27 [?]
. например, такой изврат:

Честно говоря малопонятные рег. выражения
Похоже из двух выражений составляется вырпжение , которое вычисляется.
Может быть дашь какие-то пояснения ? Что Означают символы <= в скобках ? Для общего развития.

Кстати при увеличении $a еще на пару разрядов возникает ошибка
 

amel27

Продвинутый
Сообщения
146
Репутация
55
gregaz

Похоже из двух выражений составляется вырпжение , которое вычисляется.
именно так - полный аналог обычного цикла побайтового сдвига для преобразования строки в число

Что Означают символы <= в скобках
(?=.) - проверка наличия символа справа (т.е. все кроме последнего)
(?<=.) - проверка наличия символа слева (т.е. все кроме первого)

при увеличении $a еще на пару разрядов возникает ошибка
UDF преобразует в целое ЧИСЛО, AutoIT полностью поддерживает только целые 32-битные числа (частично 64-битные)... для прямого преобразования "строка" -> "строка" в обход целых чисел потребуются специальные алгоритмы или арифметика больших чисел (тут на форуме уже обсуждалось)... есть интерес?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
amel27 [?]
UDF преобразует в целое ЧИСЛО, AutoIT полностью поддерживает только целые 32-битные числа (частично 64-битные)... для прямого преобразования "строка" -> "строка" в обход целых чисел потребуются специальные алгоритмы или арифметика больших чисел (тут на форуме уже обсуждалось)..



Добавлено:
Сообщение автоматически объединено:

amel27 [?]
UDF преобразует в целое ЧИСЛО, AutoIT полностью поддерживает только целые 32-битные числа (частично 64-битные)... для прямого преобразования "строка" -> "строка" в обход целых чисел потребуются специальные алгоритмы или арифметика больших чисел (тут на форуме уже обсуждалось)..

Значит надо вводить ограничения или обработку ошибок.
А может все-же проще выполнить с помощью математических формул основ информатики ?

Если честно -то для меня это слишком сложно.
Я глядя на твой код из 3-х строчек долго не мог понять ничего. И только потом разглядел смысл выражений.
В тонкости пока боюсь углубляться.

Спасибо за разъяснения.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
gregaz
может все-же проще выполнить с помощью математических формул основ информатики ?
простой цикл вы и сами составите, к чему повторяться?.. ;)

Если честно -то для меня это слишком сложно.
волков бояться - в лес не ходить...
состряпал тут вариант, если захотите разобраться - источник указан
http://autoit-script.ru/index.php/topic,2619.new.html#new
 
Верх