FC2ブログ
汎用ヒト型決戦遊具はじめました。
ビット演算入門(まとめ)
2010年12月03日 (金) | 編集 |
※ うまく等幅フォントにできませんでした。windows標準アプリの「メモ帳」にコピペすると、表が正しく表示されます。

【二進法】

・ゼロとイチしかない数字の数え方。

・数字が2になるとケタが繰り上がる。
 (ちなみに、ふだん私たちが使っているものは十進法。)

 0から8まで数えるとすると、
 0→1→10→11→100→101→110→111→1000
 となる。

・どんな数字も、ゼロとイチの2文字だけで表現できる。
 (十進法では、数字を0~9の10文字で表現している。)


 十進法│0│1│2│3│ 4 │ 5 │ 6 │ 7 │
 ───┼─┼─┼─┼─┼──┼──┼──┼──┼
 二進法│ 0│ 1│10│11│ 100│ 101│ 110│ 111│



・右のケタから順に2のn乗を示している。

  ケタ│64│32│16│8│4│2│1│
 ───┼─┼─┼─┼─┼─┼─┼─┼

 例1 │0│0│0│0│1│0│1│ 4+1=5

 例2 │0│0│0│1│0│1│0│ 8+2=10

 例3 │0│1│0│0│0│1│1│ 32+2+1=35

 例4 │1│1│1│1│1│1│1│ 全部足して=255



・二進法を使えば、片手の5本指で31まで数えられる。



【二進数同士の足し算】


・普通に繰り上がり(キャリー)して計算します。

0101(5)
0011(3)
________PLUS

1000(8)





【ビット(bit)】

・binary digit (2進数字)の略。

・デジタルデータの最小単位。

・オフかオンか、白か黒か、0と1だけで表現。



【ビットパターン】

・ビットの組み合わせのこと。

・101110100とか。



【ビット演算】

・ビットをイジるためのルール集。
(普通の計算、いわゆる四則演算とは全くの別物!)



【ビット演算の種類】

■ 論理和(OR)

・2つの数字のどちらか1方が1なら1。両方とも0の時だけ0。

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1


足し算と同じ結果になるので、論理和という。
二進法には2は存在しないので、1+1は2ではなく、数字が満タンということで1とみなす。


■ 論理積(AND)

・2つの数字の両方とも1の時のみ1。どちらに0があれば0。

0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1


掛け算と同じ結果になるので論理積という。



■ 排他的論理和(XOR)

・2つの数字が同じ時には0、違う時には1。

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0


他を排除しようとしている論理和。
両方とも1の時、互いに他を排除できていないので偽となる論理和。


■ 否定・反転(NOT)

・単純にひっくり返すだけ。(ですが、負の扱いがあるので要注意。)

NOT 0 = 1
NOT 1 = 0




【ビット演算と二進数の組み合わせ】

・以下、4ケタの数字が2進数、()内の数字が10進数。


■ 5 OR 3 = 7

0101(5)
0011(3)
________OR

0111(7)



■ 5 AND 3 = 1

0101(5)
0011(3)
________AND

0001(1)



■ 5 XOR 3 = 6

0101(5)
0011(3)
________XOR

0110(6)



■ NOT 5 = -6 (※後述【2の補数】)

<0>0101(5)
___________NOT

<1>1010(-6)




【ビットフラグ】

・整数の値の各ビットを、フラグ(ある条件を満たしたかどうかの記録)とみなす方法。

・CHEの動作コードは、ビットフラグを数値に置き換えたものになっている。
 (コード表参照)



【CHEのコード表と各ビットの対応状況】

ビットパターン(10進数表記) 動作
00000100000000(256) 射撃1
00001000000000(512) 射撃2
00001100000000(768) 射撃3
00010000000000(1024)射撃4
00010100000000(1280)射撃5
01000000000000(4096)右旋回
10000000000000(8192)左旋回
00000001111111(127) 基本動作(0~95が使われている)




【マスク】

・ビット演算を用い、ビットパターンから必要な部分だけを抽出する方法。


具体的な使用例:


・取得動作コードが4354(後退+右射+射撃1)の時、移動部分だけを抽出する。

1000100000010(4354)
0000001111111(127)
___________________AND

0000000000010 (2) →コード2は「後退」を意味する。


※追記:
上のマスク例では、射撃は無視されます。
たとえば、立ち止まって射撃をしている場合、静止と判断されるので注意。


********************** 以下おまけ情報 **********************

【ビットシフト】

・ビットをずらすだけで乗算・除算する方法。

・ビットパターンを左にn個ずつずらした二進数を、
 10進数で表現すると、ちょうど2倍、4倍となる。(2のn乗)


[10進数] ビットパターン (10進数)

00000001 (1)
00000010 (2)
00000100 (4)
00001000 (8)
00010000 (16)
00100000 (32)
01000000 (64)
10000000 (128)

00000011 (3)
00000110 (6)
00001100 (12)
00011000 (24)
00110000 (48)



・右に移動させるときには、1/2、1/4としていく。(2の-n乗)



【ビットシフトで奇数倍】

・ビットシフトで奇数倍したい時には、
 (n-1)倍して元の数を足す。

・たとえば、5倍する時には、4倍してから元の数を足す。


3×3=9
の計算は、
3×2+3=9
と同じなので、

00000011 (3)
を2倍するために左に1個シフトして、
00000110 (6)

これに元の数3を足すと、

00000110 (6)
00000011 (3)
------------PLUS (←ビット演算ではなく加算なので繰り上がりしてます。)
00001001 (9)




【2の補数】

・主にビットパターンで負の数字を扱う時の方法。
 言葉の意味などはgoogleなどで検索。


・一番左のビットを符号用のビットとし、1ならばマイナスとみなす。


・このとき、8ビットで最大の数は、
 <0>1111111 (+127) になる。

・ここで、8ビットで最小の数を、
 <1>0000000 (-127) とすると、

 <0>0000000 (+0)
 <1>1111111 (-0) という二種類の0が存在することになる。

・そこで、便宜上、

 <0>0000000 (0)
 <1>1111111 (-1)
というルールにしておく。(頭のいい人が決めました。)

・というわけで、
 NOT 0 は、-1となる。
 
 NOTされた正の数字は、符号を負にしてそこから-1すれば求められる。

 NOT 0 = -1
 NOT 5 = -6
 NOT 127 = -128



・このシステムの利点の一つは、
 ビット同士の引き算を、足し算で計算できること。


<0>00000110 (+6)
<1>11111101 (-3)
--------------PLUS
<0>00000011 (+3)


一番左の符号ビットがさらに繰り上がるため、捨てられる。


<0>00000101 (+5)
<1>11111011 (-5)
--------------PLUS
<0>00000000 (0)


一番左の符号ビットがさらに繰り上がるため、捨てられる。



・分かりやすい解説は、
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm

など。




10進数と2進数の変換機
http://hogehoge.tk/tool/number.html

2の補数表現
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm

ほーりーぐれいるさんの記事『[CHE]ビット演算機能を使う』
http://isadin.cocolog-nifty.com/blog/2010/11/che-a7be.html#more

チェックさんのコード表
http://check-check.at.webry.info/201011/article_2.html

スポンサーサイト



引き分け論争
2010年12月02日 (木) | 編集 |

いまさらですが、私も勝ち点について述べてみようと思います。
2chスレッドなどでの議論には参加していないので、論点が大幅にズレている可能性がありますが、
その際は「あのオッサンまたやっちゃったね!」ぐらいの気持ちで流していただければ幸いです。



好きな勝ち点の方式は、

勝ち:3
負け:0
分け:1


理由は、サッカーで使われている理由とたぶん同じ理由。
柔道の一本先取やボクシングのKO勝ちとも同じ理由です。

そのルールの上で負けないという消極的な「真の強さ」よりも、
勝利への「積極的な態度」が重視されているということだと思います。

結局は、その方が観客受けがよく、興行的に儲かるという下世話な話に落ち着くのですが、
試合のストーリーを手軽に、明快に楽しめるのもまた事実だと思います。



一方、興行ではなく、単純に強さを測定するのであれば、

勝ち:2
負け:0
分け:1

という、引き分け0.5勝方式になると思います。

証明方法はちょっとよくわかりませんが、
数学的(確率統計的に?)にはたぶんそれが正しいんだと思います。


感覚的な話になりますが、
10人のザコキャラがいたとして、
10試合を戦って1戦も負けない(けど全部引き分け)というトキと、
10試合を戦って半分は勝てる(けど半分は負ける)というケンシロウは、
直接対決しなければどちらが強いかは比較しようにもできません。
(この場合、なんだかトキが強そうにも見えますが。)



で、カルネージでこの論争が盛り上がりやすいのは、論点が2つあるからだと思います。

第一には、
「真の強さ」を計測しようという側面と、
「見た目の楽しさ」を求めようという側面が共存している。
という問題点。

創意工夫と高度な技術をつぎ込んだ判定勝ち狙いチームが存在する一方、
「逃げチーム同士は審判しててつらい」というCHP時代のアレです。

送り手であるオーナーは数値的な強さ、真の強さを求めているのに対し、
受け手である審判や観戦者やライバルが、見た目の楽しさを求めてるという
ズレに他ならないように思えます。

この仮説の場合、両者の論点がズレていますので、
議論は盛り上がりますが、結論はいつまでたっても出ないことになります。


第二には、
ゲームバランスの問題です。
修復オプションの存在が、判定狙いチーム同士の試合で引き分けを生みやすくしています。
また、「判定勝ち狙い」が結果として見かけ上、「逃げ戦術」に見えてしまい、
これがまたズレを生みます。

送り手であるオーナーは強さを求めて、その戦術を積極的に選択しているのに、
見た目の楽しさを重視する受け手には、「逃げ」という消極的な戦術に見えてしまうというズレ。

この仮説でも、誤解が双方の批判を生む構造なので、議論は大変に盛り上がりますが結論は出ません。



で、私の結論は、引き分けは今のままの0.5で良い!

となります。


そもそも、2chナンバー大会がまだ開催もされていないのに、
判定勝ち狙いチームが強いかどうかも決まってない。
というのが理由です。

だから、上の第二のゲームバランスに起因する議論をまだする必要がないということ。
また、「判定勝ち狙い」の戦術が、見た目に楽しくないかどうかも分からないので、
第一の議論もまだ存在しない、ということ。
になります。

また、観戦者としても、叩き台大会の様子を見る限りは、試合内容も十分に派手で楽しいものばかりでした。
勝ち点3にせずとも、十分に観戦を楽しめていますから、何の問題もありません。

というわけで、
いつの日か上位の半数が判定勝ちだらけになってから、
本大会での勝ち点3を検討すればよいのかなと、思います。



あと・・・今あんまりエクサやってなくてすみません。