Как заставить `bc` выводить желаемое количество двоичных цифр с основанием 2

Это выводит 101110

echo "obase=2; 46" | bc

Как я могу заставить его выводить 8 цифр, вот так? : 00101110

Я узнал об использовании bc выше здесь: Оболочка Bash Преобразование десятичного числа в двоичное с основанием 2

См. также мой ответ на этот вопрос здесь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
37
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Простое решение состоит в том, чтобы использовать вывод bc в подстановке команд, предоставляя входные данные для printf с помощью спецификатора преобразования "%08d", например.

$ printf "%08d\n" $(echo "obase=2; 46" | bc)
00101110

О Боже мой! Не могу поверить, что я не подумал об этом! Так намного проще! Мне это не пришло в голову, потому что 101110 — это нет десятичное (%d) целое число (а в C, на котором мой разум больше сосредоточен, это будет строка, В самом деле которой не является десятичным числом!). Тем не менее... технически, по крайней мере, в bash строка 101110может быть / является десятичным числом, и printf в bash можно обрабатывать ее как единицу, так что это работает.

Gabriel Staples 22.03.2022 09:03

Кроме того, как у юриста, откуда у вас столько времени на написание кода, и как вы достигли в этом такого мастерства? Это хобби, которым вы занимаетесь на работе?

Gabriel Staples 22.03.2022 09:05

Иногда это просто удача розыгрыша. Я подружился с printf давным-давно в C, так что в данном случае это своего рода способ форматирования требуемого целочисленного (или двоичного) вывода. Поскольку речь идет о менее чем 8 цифрах, вы можете рассматривать двоичный вывод с ведущим 1 как целое число :)

David C. Rankin 22.03.2022 09:05

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

David C. Rankin 22.03.2022 09:07

Кстати, вот моя printf версия, которая Я придумал здесь: printf "0b%s\n" "$(echo "obase=2; $((num1 + num2))" | bc)". Я думал о выходе bc как о строке, а не о десятичном целом числе.

Gabriel Staples 22.03.2022 09:17

Это тоже работает. Причина, по которой я предпочитаю спецификатор целочисленного преобразования, заключается в том, что он допускает как модификатор заполнения нулями, так и модификатор ширины поля. Обрабатывается как строка, вы ограничены модификатором ширины поля. Вы все еще можете добавить фиксированный префикс "0b", если хотите. Удачи вам в написании сценариев!

David C. Rankin 22.03.2022 09:20

Другой вариант — использовать спецификатор строки с шириной поля 8 символов, а затем выполнить глобальную замену пробелов на 0, например. str = " 101110"; str = "${str// /0}"

David C. Rankin 22.03.2022 09:24

Если есть более простой способ, я хотел бы знать, но вот функция, которую я только что написал, которая делает это вручную:

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

Другие вопросы по теме