2進数を10進数に変換するシェルスクリプト
- 評価
- クリップ 4
- VIEW 2,262
今年からプログラマの研修を受けている者です。
研修の課題で出たbcコマンドを使わないで2進数を10進数に変換するシェルスクリプトを作成しているのですが、計算を行うくだりがまったくわからない状態です
2進数を10進数にする計算方法は理解できたのですが、それをスクリプトで実行させる方法が分かりません
どなたかヒントをお教えいただけないでしょうか...
シェルはbashを使っています
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
2進数を10進数にする計算方法は理解できたのですが、
Bashであれば、普通に数値計算が出来るので、理解されている計算方法の通り書けば良いかと思います。
また、筆算で効率の良い計算方法と、プログラミングでコンパクトに書ける計算方法が違う可能性もあります。
decimal=0
binary=10010101111
while [ "$binary" ] #空で無い間ループ
do
x=${binary:0:1} #左端から1桁切り出して
binary=${binary:1}
let decimal=decimal*2+x #その桁を使って計算
done
echo $decimal
このファイルに対して、bash ファイル名
と打てば良いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
「課題の答え(計算手順と文字列処理手順)は知っているけど『シェルスクリプトの書き方と実行方法』が分からない」という状況とお見受けしましたので、「シェルスクリプトを書いて実行確認するまで」をざっと示してみました。
エディタで書きたいのであればcatのヒアドキュメント部分を「viとかで書いて保存して」に読み替えればいいでしょう。
$ cat <<'EOF' > b2d
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <bin>" 1>&2
exit 1
fi
a=$1
b=0
c=1
while [ -n "$a" ]; do
test "$a" = "${a%0}" && b=$((b+c))
c=$((c*2))
a=${a:0:-1}
done
echo $b
EOF
$ chmod +x b2d
$ ./b2d
Usage: ./b2d <bin>
$ echo $?
1
$ ./b2d 11010
26
$ echo $?
0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
それをスクリプトで実行させる方法が分かりません
linex系であれば、作成された先頭ラインに #!/bin/sh を記述し、実効モードを設定して
「chmod 755 hoge.sh」として ./hoge.shで実行できます。(先頭はなくても動きますが一応)
または、 sh hoge.sh でも実行できます。
あとは、 . hoge.sh でも動きます。
b=10010101111
echo "obase=10; ibase=2; $b" | bc
a=0
i=${#b}
while [ $i -ne 0 ]; do
r=${b:${#b}-${i}:1}
i=$(( i - 1 ))
a=$((a + 2 ** i * r))
done
echo $a
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
a.sh
#!/bin/bash
str=1111
num=0
for i in $(seq 0 $((${#str} - 1))); do
num=$((2 * num + ${str:$i:1}))
done
echo ${num}
参考情報
- Bash: Split string into character array
https://stackoverflow.com/questions/7578930/
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
$x = "1010"
$y = 0
for ((i=0; i < 4; i++)); do
if [$x >> 1 = 1] ; then $y = $y + (1 << $i)
done
これでいけるかな?
すいません、bash のシンタックスがうろ覚えでアレなのですが、
こんな感じだと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
コマンドラインから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
で囲ってコメントアウトします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる