二進数の計算ついて
ゴリさん
(No.1)
過去問を解いていて、分からない点があったので質問します。
[00101000]から、
[00000001]を引いたとき 答えが
[00100111]となっていたのですが、
なぜこのようになるのでしょうか。
ご回答よろしくお願いします。
[00101000]から、
[00000001]を引いたとき 答えが
[00100111]となっていたのですが、
なぜこのようになるのでしょうか。
ご回答よろしくお願いします。
2021.02.09 15:19
zyさん
(No.2)
この投稿は投稿者により削除されました。(2021.02.09 16:21)
2021.02.09 16:21
おれさん
(No.3)
ご理解の一助になればと思います。
二進数の演算では、十進数に直すやり方のほうが理解しやすいかと思います。
二進数の基礎をご理解していらっしゃることを前提に説明すると、
[00101000]は十進数に変換すると「40」となります。
[00000001]も同じく変換すると「1」
40‐1というのは「39」になるのでこちらの値を二進数に変換すると
「39」=[00100111]となるわけですね。
ご理解いただけたら幸いです。
二進数の演算では、十進数に直すやり方のほうが理解しやすいかと思います。
二進数の基礎をご理解していらっしゃることを前提に説明すると、
[00101000]は十進数に変換すると「40」となります。
[00000001]も同じく変換すると「1」
40‐1というのは「39」になるのでこちらの値を二進数に変換すると
「39」=[00100111]となるわけですね。
ご理解いただけたら幸いです。
2021.02.09 16:03
zyさん
(No.4)
すみません、ちょっと間違えてたので投稿消しました。おれさんも言ってますが、10進数に直してからやると安全で確実だと思います!
2021.02.09 16:22
いいね正解大卒さん
★FE ブロンズマイスター
(No.5)
今回のように2進数 ↔ 10進数の変換がしやすいような数値であればおれさんの解法でよろしいかと思います。ただし、ビット列が長くなるなどで計算が遅くなってしまう場合もあるかと思います。
以下に、一般に使われる解法を示します。
☆2の補数表現を利用する解法
2の補数によって負の数を表現することができるようになります。
40 - 1 を 40 + ( -1 )ととらえて計算するものと考えていただければいいかと思います。
2の補数表現への変換についてはこのサイトでも解説されてますし、ggればすぐ出てくるので割愛します。
-1(= - 0000 0001)を2進数において2の補数で表現すると1111 1111となります。
あとはこれと40(= 0010 1000)の和を求めます。
0010 1000 + 1111 1111 = 0010 0111 (最上位ビットは繰り上がると消滅します)
☆そのまま計算する解法
上記のやり方だと、2の補数表現を使わなければならないのでそこそこ時間がかかります。
そこで、ビット列を変換せずにそのまま筆算してみます。
引かれる数の最下位ビットは0なので、1は引けません。そこで1つ上の位から借りてきます。しかし1つ上の位も0なので借りてくることができません。というわけで、引かれる数の最下位から第4ビットの1を借りてくることにしましょう(いわゆる「連続したくりさがり」の計算)。
前者はかなり汎用性が高いので知っておくことをおすすめします。後者の解法は、私は好きなのですが、「こういうやり方もあるよ」程度でよいかなと思います(人間は2進数が苦手で、このやり方するとヒューマンエラーが起きやすいので)。
以下に、一般に使われる解法を示します。
☆2の補数表現を利用する解法
2の補数によって負の数を表現することができるようになります。
40 - 1 を 40 + ( -1 )ととらえて計算するものと考えていただければいいかと思います。
2の補数表現への変換についてはこのサイトでも解説されてますし、ggればすぐ出てくるので割愛します。
-1(= - 0000 0001)を2進数において2の補数で表現すると1111 1111となります。
あとはこれと40(= 0010 1000)の和を求めます。
0010 1000 + 1111 1111 = 0010 0111 (最上位ビットは繰り上がると消滅します)
☆そのまま計算する解法
上記のやり方だと、2の補数表現を使わなければならないのでそこそこ時間がかかります。
そこで、ビット列を変換せずにそのまま筆算してみます。
引かれる数の最下位ビットは0なので、1は引けません。そこで1つ上の位から借りてきます。しかし1つ上の位も0なので借りてくることができません。というわけで、引かれる数の最下位から第4ビットの1を借りてくることにしましょう(いわゆる「連続したくりさがり」の計算)。
前者はかなり汎用性が高いので知っておくことをおすすめします。後者の解法は、私は好きなのですが、「こういうやり方もあるよ」程度でよいかなと思います(人間は2進数が苦手で、このやり方するとヒューマンエラーが起きやすいので)。
2021.02.09 16:54
チンプンさん
(No.6)
単に1+1=10になることを理解してないだけでは?
10+1=11
11+1=100
が理解出来ていれば単に0と1しか存在しない世界での引き算なんですけども。
10+1=11
11+1=100
が理解出来ていれば単に0と1しか存在しない世界での引き算なんですけども。
2021.02.09 19:35
気になっ太郎さん
(No.7)
上から持ってくるのが10(2進数の2)だから、持ってきた10から1を引いて1です。他の桁は引いた1を足した時に桁上がりして戻れるように1になります。
10進数で言ったら1000から1を引いた999のイメージですかね。
2進数1000の1前は0111と言う考え方もありですよ。
10進数で言ったら1000から1を引いた999のイメージですかね。
2進数1000の1前は0111と言う考え方もありですよ。
2021.02.09 22:57
sポイントさん
(No.8)
放置プレイとはなかなかやりますな。
2021.02.10 18:47
ゴリさん
(No.9)
多数のご回答を頂いていたのに、返信が遅くなり申し訳ありません。
zy 様
ご投稿ありがとうございます。「10進数にやり直す」思いつかなかったです。
おれ 様
ご回答ありがとうございます。
確かに00101000を十進数にすれば理解しやすいですね。
いいね正解大卒 様
ビット列が長くなる場合ですか、、、今は基本技術者の試験のために勉強しているんですが、応用技術者の際に必要になりそうですね。。。
丁寧なご回答ありがとうございます。
チンプン 様
言われてみれば、確かに。。。数字が8つ並んでる状態だと気付きませんでした。
ご回答ありがとうございます。
気になっ太郎 様
[10進数で言ったら1000から1を引いた999のイメージ]
とてもイメージしやすいです。
[2進数1000の1前は0111]
これを頭に埋め込んでおきます。笑
ご回答ありがとうございます。
sポイント 様
忘れておりました。すみません。
zy 様
ご投稿ありがとうございます。「10進数にやり直す」思いつかなかったです。
おれ 様
ご回答ありがとうございます。
確かに00101000を十進数にすれば理解しやすいですね。
いいね正解大卒 様
ビット列が長くなる場合ですか、、、今は基本技術者の試験のために勉強しているんですが、応用技術者の際に必要になりそうですね。。。
丁寧なご回答ありがとうございます。
チンプン 様
言われてみれば、確かに。。。数字が8つ並んでる状態だと気付きませんでした。
ご回答ありがとうございます。
気になっ太郎 様
[10進数で言ったら1000から1を引いた999のイメージ]
とてもイメージしやすいです。
[2進数1000の1前は0111]
これを頭に埋め込んでおきます。笑
ご回答ありがとうございます。
sポイント 様
忘れておりました。すみません。
2021.02.12 17:25
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告