Это выводит 101110
echo "obase=2; 46" | bc
Как я могу заставить его выводить 8 цифр, вот так? : 00101110
Я узнал об использовании bc
выше здесь: Оболочка Bash Преобразование десятичного числа в двоичное с основанием 2
См. также мой ответ на этот вопрос здесь.
Простое решение состоит в том, чтобы использовать вывод bc
в подстановке команд, предоставляя входные данные для printf
с помощью спецификатора преобразования "%08d"
, например.
$ printf "%08d\n" $(echo "obase=2; 46" | bc)
00101110
Кроме того, как у юриста, откуда у вас столько времени на написание кода, и как вы достигли в этом такого мастерства? Это хобби, которым вы занимаетесь на работе?
Иногда это просто удача розыгрыша. Я подружился с printf
давным-давно в C, так что в данном случае это своего рода способ форматирования требуемого целочисленного (или двоичного) вывода. Поскольку речь идет о менее чем 8 цифрах, вы можете рассматривать двоичный вывод с ведущим 1
как целое число :)
Всем нужна диверсия. Поскольку я был инженером, прежде чем стать юристом (25 лет назад), приятно время от времени иметь дело с черно-белой темой.
Кстати, вот моя printf
версия, которая Я придумал здесь: printf "0b%s\n" "$(echo "obase=2; $((num1 + num2))" | bc)"
. Я думал о выходе bc
как о строке, а не о десятичном целом числе.
Это тоже работает. Причина, по которой я предпочитаю спецификатор целочисленного преобразования, заключается в том, что он допускает как модификатор заполнения нулями, так и модификатор ширины поля. Обрабатывается как строка, вы ограничены модификатором ширины поля. Вы все еще можете добавить фиксированный префикс "0b"
, если хотите. Удачи вам в написании сценариев!
Другой вариант — использовать спецификатор строки с шириной поля 8 символов, а затем выполнить глобальную замену пробелов на 0
, например. str = " 101110"; str = "${str// /0}"
Если есть более простой способ, я хотел бы знать, но вот функция, которую я только что написал, которая делает это вручную:
decimal_to_binary_string.sh: (из моего репозитория eRCaGuy_hello_world)
# Convert a decimal number to a binary number with a minimum specified number of
# binary digits
# Usage:
# decimal_to_binary <number_in> [min_num_binary_digits]
decimal_to_binary() {
num_in = "$1"
min_digits = "$2"
if [ -z "$min_chars" ]; then
min_digits=8 # set a default
fi
binary_str = "$(echo "obase=2; 46" | bc)"
num_chars = "${#binary_str}"
# echo "num_chars = $num_chars" # debugging
num_zeros_to_add_as_prefix=$((min_digits - num_chars))
# echo "num_zeros_to_add_as_prefix = $num_zeros_to_add_as_prefix" # debugging
zeros = ""
for (( i=0; i<"$num_zeros_to_add_as_prefix"; i++ )); do
zeros = "${zeros}0" # append another zero
done
binary_str = "${zeros}${binary_str}"
echo "$binary_str"
}
# Example usage
num=46
num_in_binary = "$(decimal_to_binary "$num" 8)"
echo "$num_in_binary"
Выход:
00101110
Некоторые другие решения:
echo "obase=2; 46" | bc | awk '{ printf("%08d\n", $0) }'
echo "obase=2; 46" | bc | numfmt --format=%08f
О Боже мой! Не могу поверить, что я не подумал об этом! Так намного проще! Мне это не пришло в голову, потому что
101110
— это нет десятичное (%d
) целое число (а в C, на котором мой разум больше сосредоточен, это будет строка, В самом деле которой не является десятичным числом!). Тем не менее... технически, по крайней мере, в bash строка101110
может быть / является десятичным числом, иprintf
в bash можно обрабатывать ее как единицу, так что это работает.