今年からプログラマの研修を受けている者です。
研修の課題で出たbcコマンドを使わないで2進数を10進数に変換するシェルスクリプトを作成しているのですが、計算を行うくだりがまったくわからない状態です
2進数を10進数にする計算方法は理解できたのですが、それをスクリプトで実行させる方法が分かりません
どなたかヒントをお教えいただけないでしょうか...
シェルはbashを使っています
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
投稿2019/06/01 08:10
総合スコア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
総合スコア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総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア432
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。