質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

6回答

3116閲覧

2進数を10進数に変換するシェルスクリプト

mashro0314

総合スコア13

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

1グッド

4クリップ

投稿2017/02/13 15:22

編集2017/02/13 15:38

今年からプログラマの研修を受けている者です。
研修の課題で出たbcコマンドを使わないで2進数を10進数に変換するシェルスクリプトを作成しているのですが、計算を行うくだりがまったくわからない状態です
2進数を10進数にする計算方法は理解できたのですが、それをスクリプトで実行させる方法が分かりません
どなたかヒントをお教えいただけないでしょうか...
シェルはbashを使っています

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

a.sh

bash

1#!/bin/bash 2 3str=1111 4num=0 5for i in $(seq 0 $((${#str} - 1))); do 6 num=$((2 * num + ${str:$i:1})) 7done 8echo ${num}

参考情報

  • Bash: Split string into character array

https://stackoverflow.com/questions/7578930/

投稿2019/06/01 08:10

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2進数を10進数にする計算方法は理解できたのですが、

Bashであれば、普通に数値計算が出来るので、理解されている計算方法の通り書けば良いかと思います。
また、筆算で効率の良い計算方法と、プログラミングでコンパクトに書ける計算方法が違う可能性もあります。

Bash

1decimal=0 2binary=10010101111 3 4while [ "$binary" ] #空で無い間ループ 5do 6 x=${binary:0:1} #左端から1桁切り出して 7 binary=${binary:1} 8 let decimal=decimal*2+x #その桁を使って計算 9done 10echo $decimal

このファイルに対して、bash ファイル名と打てば良いです。

投稿2017/02/14 14:47

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

それをスクリプトで実行させる方法が分かりません

linex系であれば、作成された先頭ラインに #!/bin/sh を記述し、実効モードを設定して
「chmod 755 hoge.sh」として ./hoge.shで実行できます。(先頭はなくても動きますが一応)

または、 sh hoge.sh でも実行できます。
あとは、 . hoge.sh でも動きます。

sh

1b=10010101111 2echo "obase=10; ibase=2; $b" | bc 3a=0 4i=${#b} 5while [ $i -ne 0 ]; do 6 r=${b:${#b}-${i}:1} 7 i=$(( i - 1 )) 8 a=$((a + 2 ** i * r)) 9done 10echo $a

投稿2017/02/13 19:40

編集2017/02/13 22:46
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

bash

1$x = "1010" 2$y = 0 3 4for ((i=0; i < 4; i++)); do 5 if [$x >> 1 = 1] ; then $y = $y + (1 << $i) 6done 7

これでいけるかな?
すいません、bash のシンタックスがうろ覚えでアレなのですが、
こんな感じだと思います。

投稿2017/02/13 16:24

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「課題の答え(計算手順と文字列処理手順)は知っているけど『シェルスクリプトの書き方と実行方法』が分からない」という状況とお見受けしましたので、「シェルスクリプトを書いて実行確認するまで」をざっと示してみました。

エディタで書きたいのであればcatのヒアドキュメント部分を「viとかで書いて保存して」に読み替えればいいでしょう。

bash

1$ cat <<'EOF' > b2d 2#!/bin/bash 3if [ $# -ne 1 ]; then 4 echo "Usage: $0 <bin>" 1>&2 5 exit 1 6fi 7a=$1 8b=0 9c=1 10while [ -n "$a" ]; do 11 test "$a" = "${a%0}" && b=$((b+c)) 12 c=$((c*2)) 13 a=${a:0:-1} 14done 15echo $b 16EOF 17$ chmod +x b2d 18$ ./b2d 19Usage: ./b2d <bin> 20$ echo $? 211 22$ ./b2d 11010 2326 24$ echo $? 250

投稿2017/02/13 16:11

....

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コマンドラインからrubyを起動するのはどうでしょう?

ruby -e "p gets.chomp.to_i(2)" <<COMMENT_OUT 11010 を 26 へ COMMENT_OUT

参考
Rubyで2進数と10進数の変換 - おもしろwebサービス開発日記
https://blog.willnet.in/entry/2012/01/30/112724

2進数から10進数への変換

"11111111".to_i(2) # => 255

Rubyの起動 (Ruby 2.6.0)
https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html

-e script

コマンドラインからスクリプトを指定します。-eオ プションを付けた時には引数からスクリプトファイル名を取りません。

-e オプションを複数指定した場合、各スクリプトの間に改行を 挟んで解釈します。"

シェルスクリプトで複数行を一括でコメントアウトする方法 | ITを使っていこう
https://it-ojisan.tokyo/shell-commentout/

例えば、下記のように、echo line1~echo line4の行を、

1

2
3
4
5
<<COMMENT_OUT

 

 〜

COMMENT_OUT

で囲ってコメントアウトします。

投稿2019/05/30 10:54

DrqYuto

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問