コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
怵㚟 ◆anaECiJAXKNW
2019/12/23 5:05
質問
初歩の質問をさせて下さい。
以前頑張ろうかと思ったけど結局飽きちゃって忘れていたのですが、今度こそある程度までやってみようと思い立ちました。公式の講座を少しずつ見ているのですが、ビット演算の所が腑に落ちなかったので質問させていただきます。

論理和、論理積、排他的論理和までは理解しましたが、否定と算術シフト(ビットシフト?)がよくわかりませんでした。それぞれ調べたところ、
NOT 1101 ⇒ 0010
<< 0011 ⇒ 0110 (?)
>> 0011 ⇒ 0001 (?)
という旨の解説をみつけました。併しプチコンでは上のように2進数でないのか、
NOT 0 ⇒ −1, NOT 0 ⇒ −2
1 << 0 ⇒ 1, 1 << 1 ⇒ 2, …
8 >> 0 ⇒ 8, 8 >> 1 ⇒ 4, …
となるようです。この違いは何なのでしょうか。

コメント

アバター
初心者 2019/12/23 7:44 ◆ULvuffpmw1rp
全て2進数で表示させると見えてくるかもしれません。
文字列=BIN$(値) で 2進数←10進数
となります。
プチコンでは、変数を表示させるとき10進数になります。
アバター
シロ 2019/12/23 8:04 ◆g0oUAxBiWqcj
今具体的に説明する時間が無いから適当に、一つ目は型が違う、二つ目と三つ目は使い方が違う(3 << 1は6でと3>>1は1かな)。10進の二進が知りたければBIN$を使えばいいよ。
アバター
でんぺん 2019/12/23 11:41 ◆HfSy5ayxtyTa
2進数といっても数の表現の違いなだけで2進数という特別な値があるわけじゃないのでプチコンでは通常の表示は10進数で表示されるので、その辺がわかりづらく感じているのかもしれませんね。

さらに分かりづらいのは、2進数で最上位ビットが1になると10進数ではマイナスになるので、NOTはビット反転によって最上位ビットが1になるのでマイナスの値になってしまうのもあるのかなという感じもします。

シフト演算はビットをずらしますが1<<0のように1を0ビットずらす(つまりずらさない)では意味がないので答えは1のままです。
ちなみに2進数で1ビットずらすということは2進数での桁が変わるということなので、1つずらす場合は2倍、もしくは1/2になります。(10進数だと桁をずらすと10倍、または1/10になるように)
10進数(つまり通常)の数値が2進数ではどうなるかは、他の方も書いているようにBIN$で調べるとわかりやすいですね。慣れるとBIN$を使わなくても何となく分かるようになってくるとは思いますが。
アバター
Na 2019/12/23 13:00 ◆QoELVrBXBQCI
プチコンでは2進数には&Bをつけて表すので、以下&Bつきで説明します
NOTは2進数で表したときのすべてのビットを反転します。
NOT &B0....00001101 ⇒ &B1....11110010(合計32桁)
これを10進数で書くと NOT 13 ⇒ -14 になります。
同様に NOT 0 ⇒ -1 というのは
2進数で NOT &B00000... ⇒ &B11111...(1が32個) になります。
プチコンでは整数は32bitで表すので、一番上の桁(第31ビット?)が1になると、マイナスの数になります。

シフト演算(数値 << 桁数、数値 >> 桁数)はビットを左または右に指定した桁数移動します。
<< 0011 という書き方は初めて見たんですが、たぶん1つ左にずらすことだと思うのでプチコンではこう書きます。
&B0011 << 1 ⇒ &B0110
これは10進数では 3 << 1 ⇒ 6 になります
同様に 1 << 1 ⇒ 2 は2進数で &B01 << 1 ⇒ &B10 です。
ずらす桁数を変えるともちろん結果も変わります。
1 << 2 ⇒ 4 (&B001 << 2 ⇒ &B100)
1 << 3 ⇒ 8 (&B0001 << 3 ⇒ &B1000)
右シフトも同様に>>でできます。
アバター
こういち 2019/12/23 13:31 ◆ou0jbJnEJ0Kb
負数の表現方法は慣れないと難しいかも。
2の補数だとか1の補数だとか言われています。
最上位(一番左)のビットは符号ビットと呼ばれていて、そのビットが0なら正の数を、1なら負の数を表します。
その正体は、単に-2147483648の重みを持ったビットです。
ビットは右から順に
1,2,4,8,16,…,1073741824
のように重みを持っていて、
一番左のビットのみ負の重みを持つ…みたいな感じです。

例えば、
&b00000000000000000000000000110000
だと、16と32の重みを持つビットが1なので、十進数に直すと16+32で48になります。
&b11111111111111111111111111111110
だと、-2147483648+1073741824+…+4+2
で-2になります。
アバター
&#24629;&#13983; 2019/12/25 16:34 ◆anaECiJAXKNW
回答ありがとうございました。あやうく私情を理由に質問するだけしてほったらかすところでした。すみません。

プチコンにて変数の値は10進数である、整数は32bitであるという事ですが、これ們を明示頂けただけでも収穫です。これらをどこでどう確認したらよいのか未だわからないものですから…。

これで、10進数を32桁の2進数に変換して納得できるかなと思います。何故最高位が負なのか等、ずっと抱えている疑問も幾つかありますが、これは個人的に調べます。判らなかった際は再び質問させていただきますね。
アバター
Na 2019/12/25 16:37 ◆QoELVrBXBQCI
整数が32bitについては公式サイトにも載っていますね。
3号→ http://smilebasic.com/spec/
4→ https://www.petc4.smilebasic.com/spec
アバター
&#24629;&#13983; 2019/12/25 16:52 ◆anaECiJAXKNW
また、「<< 0011」という表記について、私もブラウザの履歴から参照したサイトを再確認しました。併しそのいずれにもこのような表記は見られず、正誤が判明しませんでした。確かに見たと思うのですが…。
一応、誤謬かもしれないのでハテナを付しておきます。
アバター
ツララ 2019/12/25 18:01 ◆ArUdBYOYME1V
もうちょっとコンピュータを物理的な機械として考えてみた方が分かりやすいんじゃないんです?
そもそも何で2進数が基準になってるかっていうと、スイッチのON(1)とOFF(0)の2種類の状態で制御してるからで
イメージとしては一つの桁に珠が一つしかない算盤で32桁までの数が扱えるような感じかと。

2進数と10進数の関係ががイメージし辛いなら
10進数を一旦文字列に変換してシフト演算みたいなことしてみれば
仕組みが分かりやすいんじゃないんです?
桁上がりの左シフト(<<)だと2倍に、桁さがりの右シフト(>>)だと2分の1になるのって2進数だからで
10進数だと10倍と10分の1になりますし。

何で一番上位の桁のビットを符号ビットにするのかについては
2進数の足し算をやってみればいいんじゃないかと。
例えば 1+(-2) は
  0~略~001
+ 1~略~110
で答えは
  1~略~111
で -1 になるのって算盤をイメージすると分かりやすいですよね。
ついでに 3+(-2) は
  0~略~011
+ 1~略~110
で 1 になるのも。

ところで「怵㚟」って何て読むんです?
アバター
こういち 2019/12/26 19:58 ◆ou0jbJnEJ0Kb
別言語では、最上位が負でない整数も存在します。その整数は、正の数の扱える範囲が2倍になる代わりに、負数が扱えなかったりします。負数を扱う場合、例えば+4と-4で区別が付かないと困るので、どこかのビットで正負の情報を表す必要が出てきます。

そして、負数の表現方法は、2の補数以外にもいくつかありますが、2の補数はいろいろとメリットがあります。(以下、説明のため例は8ビット)
例えば、最上位ビットで正負を表し、残りのビットで絶対値を表す方法

1000111(-7)
0000111(7)

1の補数と呼ばれる方法で、1と0を反転させて負数を表現する方法
1001111(-48)
0110000(48)

そして0と1を反転させた後に1を足して負数を表現する2の補数
1110101(-11)
0001011(11)

などがあります。いずれも最上位ビットが1なら負。
回路の視点から見ると、1の補数と2の補数は、引き算を簡単に実現できます。
また、2の補数は1の補数に比べて扱える範囲が負方向に1大きいです。(1の補数は0が+0と-0の2種類存在するため)
アバター
&#24629;&#13983; 2019/12/28 17:53 ◆anaECiJAXKNW
あの後も回答を頂いて居たとは思いませんでした。ありがとうございます。バカ正直に言えばちゃんと理解できた訳ではありませんが、シフトの解説はなるほどと思えました。

最近何も見なくても2の補数と1の補数を区別できるようになったつもりで居ます。何故突然これが出てくるのかよく分かって居ませんでしたが、最高位が符号の役割を担う「必要がある」という説明をみて少し分かってきました。
アバター
&#24629;&#13983; 2019/12/28 19:53 ◆anaECiJAXKNW
おおよそ腑に落ちなかった所が理解出来ました。ありがとうございました。
トピックは閉鎖できるのでしたっけ。追記が出来なかったら閉鎖できたと思って下さい。

コメントを書く

この投稿にはコメントできません。

- WEB PATIO -