vak: (Default)
[personal profile] vak
На компьютере я обычно работаю в командной строке Линукса или Мака. Часто возникает нужда перевести число из одной системы счисления в другую. Вызывать для этого специальную программу или брать в руки калькулятор слишком сложно. Я сделал набор скриптов на Питоне, решающих задачу прямо из командной строки. К примеру:
$ bin 13
1101
$ hex 33000
0x80e8
$ dec 0x1020
4128
Скрипты очень простые:

~/bin/hex:
#!/usr/bin/python
#
# Convert integer value to hex.
#
import sys

if len(sys.argv) != 2:
    print "Usage: hex number"
    sys.exit(1)

print "%#x" % int(sys.argv[1], 0)
~/bin/dec:
#!/usr/bin/python
#
# Convert integer value to decimal.
#
import sys

if len(sys.argv) != 2:
    print "Usage: dec number"
    sys.exit(1)

print "%d" % int(sys.argv[1], 0)
~/bin/oct:
#!/usr/bin/python
#
# Convert integer value to octal.
#
import sys

if len(sys.argv) != 2:
    print "Usage: oct number"
    sys.exit(1)

print "%#o" % int(sys.argv[1], 0)
~/bin/bin:
#!/usr/bin/python
#
# Convert integer value to binary.
#
import sys

if len(sys.argv) != 2:
    print "Usage: bin number"
    sys.exit(1)

print "{0:b}".format(int(sys.argv[1], 0))

Date: 2018-12-21 22:32 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
$wcalc -p -q -b 13

Date: 2018-12-21 22:51 (UTC)
sab123: (Default)
From: [personal profile] sab123
Команда printf делает аналогичное:

printf "%x\n" 10
printf "%d\n" 0x10

Date: 2018-12-22 01:35 (UTC)
sab123: (Default)
From: [personal profile] sab123
Я и так уже запомнил формат для printf, без алиасов :-)

Date: 2018-12-21 23:50 (UTC)
ext_792584: (Default)
From: [identity profile] http://poxod.com/lev/
А зачем ограничивать только одним аргументом командной строки? Мой подход к таким утилитам обычно "принимать сколько угодно аргументов, и печатать по одному на строчку на выходе".

Ну да, чаще всего одно число перевести надо, но если вдруг понадобится перевести три, то что, три раза название скрипта печатать? :)

Date: 2018-12-22 04:34 (UTC)
ext_792584: (Default)
From: [identity profile] http://poxod.com/lev/
А чем вот такое сложнее, чем исходный скрипт? :)

#!/usr/bin/python
#
# Convert integer value(s) to decimal.
#
import sys

for arg in sys.argv[1:]:
    print "%d" % int(arg, 0)

Date: 2018-12-22 06:32 (UTC)
henry_flower: A melancholy wolf (Default)
From: [personal profile] henry_flower
яка все-таки пáйфон потворно виглядаюча мова

$ ruby -e 'ARGV.map{|v| puts v.to_i 16}' 0x1020 80e8
4128
33000


*ducks & runs*

Date: 2018-12-22 06:37 (UTC)
ext_792584: (Default)
From: [identity profile] http://poxod.com/lev/
Ну я так и знал что по первому вопросу у нас расхождений не будет :)

Date: 2018-12-22 05:07 (UTC)
vlkamov: Рембрандт. Автопортрет с широко открытыми глазами. (Default)
From: [personal profile] vlkamov
vlkamov@arm2d:~$ perl -e 'printf("%X\n", 10+2)'
C
vlkamov@arm2d:~$

Date: 2018-12-23 13:53 (UTC)
dmytrish: (qnxroot)
From: [personal profile] dmytrish
Intel Core i7 8th gen, SSD на лінуксовому NVM-інтерфейсі, 16 Гб оперативки:

mitra@titan:~$ time printf "0x%x\n" 33000
0x80e8

real    0m0,000s
user    0m0,000s
sys     0m0,000s
mitra@titan:~$ time hex 33000
0x80e8

real    0m0,031s
user    0m0,027s
sys     0m0,004s


Це я до того, що писати скрипти для власного користування можна хоч на Brainfuck, але коли скриптами починають користуватись інші скрипти...