コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
Soybeanman ◆SDLkyXUP6WqK
2018/8/9 15:25
大豆マン君が教える、ビットについてみるみるわかってしまう!
ビット講座!(便乗)

コメント

アバター
こういち 2018/8/9 16:13 ◆ou0jbJnEJ0Kb
ビットを使うと画像を高速に加工出来るんだぜぇ。ワイルドだろぉ?
アバター
Soybeanman 2018/8/9 16:19 ◆SDLkyXUP6WqK
こういちさん
スギちゃん懐かしいですね!

別にビットにしなくていい数値を全部ビットにしてやったぜぇ。
その上、数値の上にコメントで、でたらめな数値を書いて元の数値と勘違いされるようにしてやったぜぇ。
ワァイルドだろぉ!?

ちなみに第4回目は明日更新予定です。
アバター
こういち 2018/8/9 16:25 ◆ou0jbJnEJ0Kb
ビットを使ってアフィン変換を行った例。
(実はプチコンで撮ったスクショをProcessingで加工してたり。もちろんプチコンでも同じことはできます。)
アバター
こういち 2018/8/9 16:27 ◆ou0jbJnEJ0Kb
ビットを使ってモルフォロジー変換を行おうとするも失敗するの図。
実は下画面のほうがサイズが320*240でビットと相性が良かったり。
アバター
こういち 2018/8/9 16:35 ◆ou0jbJnEJ0Kb
gardeningbeanmanさん(名前違う)
おぉー。ワイルド!!そして自分でも読めなくなるパターン。
ちなみに元画像はこちら。
アバター
しょぼーん 2018/8/9 21:58 ◆lp6HwPeaFWPI
ビットはフラグ管理に便利だゾ
頑張ればセーブデータを変数一つにできる(配列使え)
あと2進数は指折りで数えると簡単(当社比)
それと画像処理詳しく教えて(懇願)
アバター
だにえる 2018/8/10 3:23 ◆m76OCAQyrWGt
ビットを利用すると
個々の処理がシンプルになるから
処理速度向上には持ってこい
アバター
こういち 2018/8/10 8:15 ◆ou0jbJnEJ0Kb
ビットを使った画像処理(スキュー)
例えば32*32の2値画像があった場合、
白の部分を1、黒の部分を0…みたいにすれば要素数32の整数型配列で表現できます。
あとはその配列をAとすると
FOR I=0 TO 31
 B[I]=A[I]>>(31-I)/2
NEXT I
とすれば、Aをスキューした画像がBに入ります。
実際は符号ビットとか繋ぎ目とかが面倒なんですが、大体こんな感じです。
ビットボードで検索すると参考になるかも。
アバター
Soybeanman 2018/8/10 13:41 ◆SDLkyXUP6WqK
Wow!(ネイティブ)
一日でこんなにコメントが!
皆さんありがとうございます...!
アバター
Soybeanman 2018/8/10 13:55 ◆SDLkyXUP6WqK
4.ビットの計算
前回説明した通り、ビット列は数値として扱えます。
今回はビット列同士の足し引き、そしてシフトについてやります。
・足し算
1110+1101をします。
0ビット目を足し合わせると、0+1=1。
1ビット目も同様に、1+0=1。
2ビット目は、1+1...ん?ビットは0と1だけで表現されるので2は存在しません。
じゃあどうするのか。繰り上がりをします。
私たちの日常で使う10進数は1桁で最大の数、9の次に繰り上がります。
ビット列も同じで1が1桁で最大の数。なので10になり、
2ビット目は0になります。
3ビット目は、さっきの繰り上がりの分も足して、
1+1+1になります。
なので11になります。
すべて全て並べると、11011になります。
(続く)
アバター
Soybeanman 2018/8/10 14:10 ◆SDLkyXUP6WqK
(続き)
・引き算
110-101をします。
0ビット目が0-1で-1...ん?ビット列にはマイナスが無い(代わりに31ビット目が数値の時に+-の役割をします)ので繰り下がりをしなければなりません。
1ビット目の1を持ってきて10-1で1になります。
1ビット目は0-0で0
2ビット目が1-1で0
全て並べて001。0は省略していいので1になります。

・シフト
シフトとは、簡単に言えば、ビット列の位を上げたり下げたりすることです。
プチコンでは
左シフト(<<)で位を上げます。(1101<<1=11010、1101<<3=1101000)
同様に、
右シフト(>>)で位を下げます。(1101>>1=110、1101>>3=1)
位を下げるとき、小数点以下になってしまうビットは削除されます。

今回のまとめ
・足し算、引き算は繰り上げ、繰り下げをすれば手計算でもできる。
・シフトで位を上げたり下げたりできる!
アバター
Soybeanman 2018/8/10 14:20 ◆SDLkyXUP6WqK
5.論理演算について
前回は、足し引きをビット列でやりましたが、あれは非効率的です。
前回は位が少なかったのでいいですが、位が多くなった場合マジやばたんです。
なので計算を行うときはビット列を数値に直してからしましょう。

今回は、そんな劣等生ビット君にしかできない、マジックをします。
マジックと言っても、帽子から鳩が出てきたり、触れた物を爆弾にするとかでは無いです。
タイトルにもある通り、論理演算についてやります。
論理演算とは、ビット列同士の共通点、またはそうでない点を比べて一つのビット列を出すことです。
意味が分かりにくいと思うので実際に見てみましょう。
(続く)
アバター
Soybeanman 2018/8/10 14:31 ◆SDLkyXUP6WqK
(続き)
論理演算にはAND、OR、XORなどがあります。
今回はその3種類についてやります。
・AND(論理積)
簡単に言えばビット同士のかけ算です。
ー例ー
101 AND 100をやります。
0ビット目が1と0なので0になります。
1ビット目が0と0なので0になります。
2ビット目が1と1なので1になります。
計算結果は100です。

・OR(論理和)
ANDがかけ算ならこちらは足し算のような物です。
ー例ー
101 OR 100をやります。
0ビット目が1と0なので1になります。
1ビット目が0と0なので0になります。
2ビット目が1と1なので1になります。
計算結果は101です。

・XOR(排他的論理和)
1と0のペアなら1でそうでなければ1になる、特殊な演算です。
ー例ー
101 XOR 100をやります。
0ビット目が1と0なので1になります。
1ビット目が0と0なので0になります。
2ビット目が1と1なので0になります。
計算結果は1です。

今回のまとめ
・論理演算はすごい!
次回は明日書きます。
アバター
しょぼーん 2018/8/10 19:50 ◆lp6HwPeaFWPI
上の誤字 OR→XOR
結構助かるNOT先輩と論理反転先生とすべての大本NAND親分がいない………。

»こういちさん、ダニエルさん
ありがとうございます。
確かにビット+配列って便利ですね。
いちおう画像処理やってたんで勉強になります。
アバター
Soybeanman 2018/8/11 14:11 ◆SDLkyXUP6WqK
>>しょぼーんさん
コメントありがとうございます!
誤字指摘助かります。
NOTはプチコンの場合、算術演算に入ると聞いていたので入れませんでした。
後で調べてみたところ、論理演算という解釈が一般的な解釈だったので、
今回の第6回目に書きたいと思います。
NANDはプチコンではそのまま論理演算子として無かったので入れませんでした……
アバター
Soybeanman 2018/8/11 15:16 ◆SDLkyXUP6WqK
6.論理演算について2
前回の続きで、論理演算子を解説していきます。
・NOT(否定)
ビット列を反転します。
ー例ー
NOT 10をします。
0ビット目が0なので1になります。
1ビット目が1なので0になります。
計算結果は1です。

・NAND(否定論理積)
プチコンにはありませんが、他の言語では使える物もあります。
プチコンでも自作命令で再現できます。
DEF NAND(A%,B%)
 RETURN NOT(A% AND B%)
END
ー例ー
NAND(101,100)をやります。
0ビット目が1と0なので1になります。
1ビット目が0と0なので1になります。
2ビット目が1と1なので0になります。
計算結果は11です。

今回のまとめ
・NOTで世界が大きく変わる!

次回は半加算器と全加算器です。
スマブラSP発売までに更新したいです。
アバター
こういち 2018/8/11 15:20 ◆ou0jbJnEJ0Kb
そのうちシフトレジスタとかJK-FFとかの話題になりそう。
アバター
Soybeanman 2018/8/11 15:29 ◆SDLkyXUP6WqK
>>こういちさん
そこまで行くと電子工作講座になりそうなのでやめときますw
アバター
Soybeanman 2018/8/15 13:48 ◆SDLkyXUP6WqK
7.半加算器と全加算器
前回、前々回は論理演算についてやりました。
今回はそれがどのように使われているか、どんな構造かについて話したいと思います。
使われている場所の例として、計算機が挙げられます。
PCも計算機と言われれば大体そうです。
計算機はどのようにして足し算を行っているかというと、
数値が入力される(ここでは31ビットとする)

加算器によって足し算(繰り上がりも含めた32ビットが出力)される
みたいな感じです。
加算器は、半加算器と全加算器を組み合わせて出来ています。
(続く)
アバター
Soybeanman 2018/8/15 14:25 ◆SDLkyXUP6WqK
(続き)
・半加算器
A,Bの2つの入力と、S(その桁の出力)、C(繰り上がり)で出来ています。
0ビット目は半加算器のSで出力します。
自作命令で表すと、
DEF HARF_ADDER A%,B% OUT S%,C%
 S%=A% XOR B%
 C%=A% AND B%
END
になります。
論理演算で出来ています。
なので、前回までの内容が理解出来ていれば、
wikiなどを見ながら作れると思います。

・全加算器
A,B,X(前ビットからでた繰り上がり)の3つの入力と、S(その桁の出力)、C(繰り上がり)で出来ています。
1ビット目以降は全加算器のSで出力します。
自作命令で表すと、
DEF FULL_ADDER A%,B%,X% OUT S%,C%
 VAR S1%,S2%,C1%,C2%
 HARF_ADDER A%,B% OUT S1%,C1%
 HARF_ADDER S1%,X% OUT S2%,C2%
 S%=S2%
 C%=C1% OR C2%
END
になります。

・加算器
ビット列1,2を足します。
入力はA(ビット列1),B(ビット列2)の2つで、出力はO(加算したビット列)です。
自作命令で表すと、
DEF ADDER(A%,B%)
 VAR N%,S%,C%,O%
 HARF_ADDER A% AND 1,B% AND 1 OUT S%,C%
 O%=S%
 FOR N%=1 TO 30
  FULL_ADDER A%>>N% AND 1,B%>>N% AND 1,C% OUT S%,C%
  O%=O%+S%*POW(2,N%)
 NEXT
 RETURN O%+C%*POW(2,31)
END
になります。

今回のまとめ
・論理演算で足し算ができる!

次回の予定はまだありませんが、予定が立ったらお知らせします。
また、リクエストがありましたら、出来る範囲で書こうと思います。

コメントを書く

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

- WEB PATIO -