プレイ日記
サクヤ cocoapple00
(プレイ日記のテスト投稿兼ねてます) 配列って設定した時点でメモリくうんですね。 画像の配列を設定しただけで一発アウトでした。 中身を入れた時点でメモリをくうのかと思っていたのですが、違うのか。困ったな……。最低でも200,100,200で設定したかったのに(^^;)
2そうだね
プレイ済み
返信[1]
親投稿
MIKI ifconfig
A% にすれば 150x50x150 はいけるみたいですね~
0そうだね
プレイ済み
返信[2]
親投稿
サクヤ cocoapple00
そうか!%って手がありましたね! 300万バイトくらい残していけました~♪ 教えていただきありがとうございます(*^^*)
0そうだね
プレイ済み
返信[3]
親投稿
MIKI ifconfig
一つのデータが2バイトで済むなら a[z,y,x] の代わりに a$=" " * 200 * 100 * 200 としておいて a$[z * 20000 + y * 200 + x] = chr$(12345) if a$[z * 20000 + y * 200 + x] == chr$(12345) then ~ のようにすればできるかも。 負の値はうまいこと変換してね。
1そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
あ!! 掛け算は遅いから a$[z / 0.00005 + y / 0.005 + x] の方が速くなるでしょう!! (泣き笑い)
0そうだね
プレイ済み
返信[5]
親投稿
サクヤ cocoapple00
ありがとうございます! 書き写して実行してみたところ、6万バイト残して実行できました♪ ただ、私の今の知識量では、このプログラムが何をしているのかわからず……orz えーと、頭の『a$=" "×200~』は何の為に設定しているのでしょうか? この部分を実行するとどうやら、残りバイトが6万になるみたいです。 200×~に関しては、私が200,100,200の配列を作りたいと言っていたから、だとは思うのですが……。 よろしければ、コメントの残り数が余っている時にでも教えてください(*^^*)
0そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
"a"*10 は "aaaaaaaaa" (10個の"a") と同じ文字列になります。 一次元配列 dim a[200] を定義した時メモリ内には a[0], a[1], ... ,a[199] という順番で配列の各要素が確保されます。 二次元配列 dim a[100,200] ならば a[0,0], a[0,1], ... ,a[0,199] a[1,0], a[1,1], ... ,a[1,199] : a[99,0], a[99,1], ... ,a[99,199] の順にメモリに並びます。
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
三次元配列 dim a[200,100,200] の場合 a[0,0,0], a[0,0,1], ... , a[0,0,199] 'まずxが増える a[0,1,0], a[0,1,1], ... , a[0,1,199] '次にyが増える : a[0,99,0], a[0,99,1], ... , a[0,99,199] a[1,0,0], a[1,0,1], ... , a[1,0,199] 'zが増える : a[1,99,0], a[1,99,1], ... , a[1,99,199] a[2,0,0], a[2,0,1], ... , a[2,0,199] : a[199,99,0], a[199,99,1], ... , a[199,99,199] という順にメモリに並びます。
0そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
このプログラムの目的は、一次元配列を確保して(文字列は文法上一次元配列として使えます)、それをあたかも多次元配列として使いたいということです。 ここまでの説明で、dim a[ny,nx] としたとき、その並びは a[0,0],a[0,1],..,a[0,nx-1],a[1,0],a[1,1],..,a[1,nx-1],a[2,0],.......,a[ny-1,0],a[ny-1,1],...a[ny-1,nx-1] となっていることはわかると思います。 具体的にny=3,nx=2の場合 a[0,0],a[0,1],a[1,0],a[1,1],a[2,0],a[2,1] という6個の並びになりますね。 ここで dim b[6] を考えます。その並びは当然 b[0],b[1],b[2],b[3],b[4],b[5] となります。
0そうだね
プレイ済み
返信[9]
親投稿
MIKI ifconfig
a[0,0]⇔b[0] a[0,1]⇔b[1] a[1,0]⇔b[2] a[1,1]⇔b[3] a[2,0]⇔b[4] a[2,1]⇔b[5] という一対一の対応付けが可能です。ということは、脳内では配列 a に対して読み書きするつもりで、それを実際のプログラムでは配列 b に対して読み書きすることに置き換えすることが可能です。 脳内 a[0,0]=100 ⇔ プログラム b[0]=100 脳内 a[0,1]=200 ⇔ プログラム b[1]=200 脳内 ? a[1,0] ⇔ プログラム ? b[2] 脳内 if a[1,1]>0 ⇔ プログラム if b[3]>0 脳内 v=a[2,0] ⇔ プログラム v=b[4] 脳内 spofs a[2,1],x,y ⇔ プログラム spofs b[5],x,y ざっとこんな感じ
0そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
ここまで ny=3, nx=2 で考えたけど、これを ny, nx に戻すと a[y, x]⇔b[y * nx + x] という一対一対応になるんです。 脳内配列 dim a[ny,nx] に対する読み書きを、現実のコード dim b[ny * nx] に対する読み書きで置き換えが可能なのです。 脳内 a[y,x]=200 ⇔ プログラム b[y * nx + x]=200 脳内 ? a[y,x] ⇔ プログラム ? b[y * nx + x] 具体的に y = 0, x = 1 や y = 1, x = 0 の場合を考えれば、上のコメの通りになっていると思います。 二次元の場合はこれで ok
0そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
三次元の場合は、結論だけ書くと 脳内配列 dim a[nz, ny, nx ]⇔ 現実コード dim b[nz * ny * nx] 脳内配列 a[z, y, x] ⇔ 現実コード b[(z * ny + y) * nx + x] という一対一対応になります。 以上説明終わり。不明な点があればまた聞いてください!!
0そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
具体的な値 nz=4,nx=3,nx=2 などで図を書いて検証するとわかりやすいかなあと思います。
0そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
あ、文字列を使った意味は、 dim a[n] の場合 a は倍精度浮動小数点小数: 8*nバイト使用 dim a%[n] の場合 a% は整数: 4*nバイト使用 dim a$=" "*n の場合 a$ はutf-16: 2*nバイト使用 という感じで最小サイズで実装できるからです。
1そうだね
プレイ済み
返信[14]
親投稿
Godot orz_127
文字列の場合 メモリ上ではUTF-16ですが ファイル上はUTF-8となります。 この際CHR$(13)はCHR$(10)に置換されてしまうようです。 SAVEしてLOADすると13だった筈のデータが10になっていると言うことに。 文字列を2バイトの数値配列の代わりとして扱う場合、注意が必要です。
0そうだね
プレイ済み
返信[15]
親投稿
サクヤ cocoapple00
みき★さん 詳しい解説ありがとうございます! 一次元配列を多次元配列のように扱えるんですね。プログラムって奥が深いですね。 まだプチコン本体で色々試せてないので、細かい部分は理解しきれていませんが、おおよその流れは理解できました。あとで色々試してみます(^^) それとは別にですね、(文字列は文法上一次元配列として扱えます)という部分がわからないです。 文字列は文字列、一次元配列は一次元配列だという思いから抜け出せないです。DIMで設定しなくてもa$[z*20000+~]が使えるのはこの為でしょうか? 良かったら教えてください。 あと、上のchr$(12345)って、これで表示される文字が重要なのかと思っていたのですが、もしかして文字ではなく、この代入する数字が大事だったりしますか? 文字列に数字を代入できるという意味で。よく考えたら何通りか数字のみの抜き出し方もありますし(^^)
0そうだね
プレイ済み
返信[16]
親投稿
サクヤ cocoapple00
Godotさん 情報ありがとうございます!
0そうだね
プレイ済み
返信[17]
親投稿
MIKI ifconfig
げげ!! マジッすか!?!? > chr$(13)->chr$(10) そこはなんか考えないとダメだなあ・・・ >文法上一次元配列 文字列 a$ に対して a$[i] で i 文字目の読み書きができます。 a$ = "1234" for i = 0 to len(a$)-1: ? a$[i]: next とか a$="abcd": a$[2] = "z": ? a$ とか 便利ですね。a$=" "*200*100*200 すれば、a$[0] から a$[200*100*200-1]まで使うことができます。
1そうだね
プレイ済み
返信[18]
親投稿
MIKI ifconfig
>もしかして文字ではなく、この代入する数字が大事だったりしますか? その通りです。一文字に対して 0 から 65535 までの数値を書いて、読むことができます。ただし整数のみです。 脳内 a[z,y,x]=1234 ⇔ 現実 a$[(z*ny+y)*nx+x]=chr$(1234) 脳内 v = a[z,y,x] ⇔ 現実 v = asc(a$[(z*ny+y)*nx+x])
1そうだね
プレイ済み
返信[19]
親投稿
MIKI ifconfig
負の整数を使いたい場合、-32768から32767の範囲になります。次のような関数で符号なし(0..65535)と符号あり(-32768..32767)を相互変換できます。 def u2i(u16%) ' 符号なしから符号ありに変換 return ((u16%+32768) and 65535)-32768 end def i2u(i16%) '符号ありから符号なしに変換 retrun i16% and 65535 end 符号ありの整数 k を文字列に入れる場合 a$[i] = chr$(i2u(k)) それを読む場合 k = u2i(asc(a$[i])) とします。 混乱してきたかな???
0そうだね
プレイ済み
返信[20]
親投稿
MIKI ifconfig
おそらく三次元のマップを表現したいのだと思います。 その場合は符号なしの整数のみで足りますよね? あと Godot さん情報に注意して、13 という数はマップの要素として使わないことにすれば万事解決です。 要素が高々数十種類しかないのであれば、数値ではなく文字そのものに割り当ててしまい "0" = 空白 "1" = 地面 など決めておけば、asc/chr$ を呼ぶ手間が省けて速くなります。
1そうだね
プレイ済み
返信[21]
親投稿
Godot orz_127
以前、美咲フォントの文字パターンデータをみき★さんの方式で2バイト分をCHR$()で変換して文字に、取り出すときはASC()で、とやっていたときに、その事実を知ってびっくりw 幸い13のデータはなかったので影響なかったのですが、SAVEしてあれ?っと。 サイズが文字数×2バイトでなく、やたら大ききい。 結局UFT-8なので1文字が2バイト出はなく、3バイトだったりするのでサイズが想定より大きくなります。 SAVEを考えると数値配列に詰め込んだ方が無駄なくまとめられることに。 結局文字パターンは数値配列に詰め込み直して、扱うことにしました^^; 結構データ量もおおくなりそうだし、数値配への詰め込みでやった方が無難かと。
0そうだね
プレイ済み
返信[22]
親投稿
MIKI ifconfig
なるほど。 ただ、整数配列にすると現実コードが相当遅くなりますね~。特に書くとき。「配列読んで and して or して配列書く」になるので・・考えただけで遅そう・・・ 保存データが大きくなったり時間がかかったりするのは特に問題ないと思います。公開ファイルについてくるわけでもないし、プレイヤーの意思で保存するのだろうし。 小さければファイルi/oだけ整数配列にするという手段もありますが、巨大な文字列だと無理っぽいですね。
0そうだね
プレイ済み
返信[23]
親投稿
RION LION-ITO
そんなことより 畑ゲーやりたいです。
0そうだね
プレイ済み
返信[24]
親投稿
サクヤ cocoapple00
>文法上は一次元 なんと!そんなことができたのですか!! ものすごく便利ですねー♪ 色々と応用できそうでワクワクします(*^^*) chr$(12345)の件、合っていましたか。良かったです♪ 今まで教えていただいたお話と合わせて、ようやく一番上のプログラムの意味が理解できました。色々教えてくださって、ありがとうございました! と思っていたらまた「UFT-8」さんという難問さんが……orz えーと、まず、プチコンではUFT-16で動いていると見せかけて、内部ではUFT-8で動いていた。で、UTF-16は2バイトだけど、UTF-8は3バイト。なので実質3バイトかかってしまう。 あとchr$(10)とchr$(13)は確か両方改行用のコード?だけど、(13)はUFT-16用だから、内部で処理をしたときに、UFT-8用である(10)に変換されてしまうので、(13)は使えない。で合ってます?
0そうだね
プレイ済み
返信[25]
親投稿
MIKI ifconfig
内部は utf16 だけど、txt: で保存するときに、 (1) utf-16をutf-8 に変換 (2) chr$(13)をchr$(10)に変換 (utf-8/16の話とは関係ありません) で txt を読むときには (1') utf-8をutf-16に変換 (2') chr$(10) はそのまま (2) のオマヌケな仕様(もしくはバグ)のせいで、保存した内容とはちょっと異なる結果になる・・・
0そうだね
プレイ済み
返信[26]
親投稿
サクヤ cocoapple00
あと、uni-code(でしたっけ?)は正の整数しかないので、負の数を使うには処理が必要。と言うことで、教えていただいた関数を入れるときと出すときに使う……という感じでしょうか? 関数の内容は……む、難しくてわからないです。ANDが難しくて避けてたので、もうさっぱり(^^;) えーと確か○○AND●●で、○○の中に●●が含まれるか?でしたっけ?? む、難しい……。 みき★さんが仰った通り、要素はそんなに種類ないと思うので、0~9まで一文字ずつ対応決めて入れていくのがいいかもしれませんね(^^) あ、一文字ってことなら、0~9だけじゃなくキーボードにある記号も使えたり……?
0そうだね
プレイ済み
返信[27]
親投稿
サクヤ cocoapple00
>オマヌケな仕様(もしくはバグ) あ、そっちでしたか! 教えていただきありがとうございます。 間違って理解するところでした(^^;)
0そうだね
プレイ済み
返信[28]
親投稿
MIKI ifconfig
符号ありなし変換の意図はその通りです。 内容は・・これは決まり文句みたいなものだから、とりあえずこのまま使うか、使わなくてもいいかもですね。 打てる文字なら何でも入れることができますよ a$[((z*ny)+y)*nx+x]="床" とか。(「床」と入力できると仮定して)
0そうだね
プレイ済み
返信[29]
親投稿
MIKI ifconfig
and や or は表で覚えてください。まず x and y。x が 0 か 1, y が 0 か 1 の全ての組み合わせを考えます。 x|y|x and y -+-+------- 0|0|0 0|1|0 1|0|0 1|1|1 x が 1 かつ y が 1 の時だけ x and y も 1 になります。掛け算そのものですね。and が論理積と呼ばれるゆえんです。or も同様に表にします。 x|y|x or y -+-+------- 0|0|0 0|1|1 1|0|1 1|1|1 x または y のいずれかが1なら x or y も1になります。算数の和とは少し違いますが、これを以て論理和といいます。
0そうだね
プレイ済み
返信[30]
親投稿
MIKI ifconfig
ここまで何も難しい事はないですね。ここで 4 桁の「整数」 a b について考えます。 a=1100 b=1010 この時 a and b や a or b はどうなるの? これについては、理屈ではなくて、定義によって次のように決まっています。 多桁の場合 a and b, a or b は、各桁について独立に先ほどの表の通りに演算します。繰り上がりはしません。 ______a|1100 ______b|1010 a and b|1000 _____a|1100 _____b|1010 a or b|1110 ここも特に難しい所はないですよね。
0そうだね
プレイ済み
返信[31]
親投稿
MIKI ifconfig
なんか違う気がしますかそうですか。実際にやってみると ? 1100 and 1010 64 ↑全然ちがうじゃん!! 上コメでは意図的に省いたんですが、4桁の「整数」とは a, b それぞれを「2 進数表記した整数」だったんです。出た!! 二進数!! 思考停止しそうですね。 ここで小学生に戻って、十進数の表記方法を思い出しましょう。 十進数で1234と書いてあったら、 一の位=4 十の位=3 百の位=2 千の位=1 となって、(1000*1) + (100*2) + (10*3) + 4 = 1234 という計算が成立します。 十進数表記では、全桁について ○の位=x なら ○*x を足した結果が数値になります。
0そうだね
プレイ済み
返信[32]
親投稿
MIKI ifconfig
二進数の場合、位取りは、右から左へ 一の位 二の位 四の位 八の位 十六の位 三十二の位 六十四の位 : となります。 二進数で 1100 と書いたら 一の位=0 二の位=0 四の位=1 八の位=1 となって、(8*1) + (4*1) + (2*0) + (1*0) = 12 (十進数) つまり 1100(二進数)=12(十進数)となります。
0そうだね
プレイ済み
返信[33]
親投稿
MIKI ifconfig
この十進数と二進数の変換が一番難しいところです。理屈は上に書いた通りですが、手っ取り早く暗記してしまうのも一つの方法です。というか多くのプログラマは暗記してます。 十進数 二進数 0 = 0000 1 = 0001 2 = 0010 3 = 0011 4 = 0100 5 = 0101 6 = 0110 7 = 0111
0そうだね
プレイ済み
返信[34]
親投稿
MIKI ifconfig
十進数 二進数 8 = 1000 9 = 1001 10= 1010 11= 1011 12= 1100 13= 1101 14= 1110 15= 1111 ここまでだいじょうぶですかね??
0そうだね
プレイ済み
返信[35]
親投稿
MIKI ifconfig
と思ったけど暗記はキリのいい数だけで大丈夫です。 十進数 二進数 1 =1 2 =10 4 =100 8 =1000 16=10000 32=100000 以下64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 と続きます。 余裕があれば 3 =11 7 =111 15=1111 31=11111 以下 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 と続きます。
0そうだね
プレイ済み
返信[36]
親投稿
MIKI ifconfig
いよいよ話はbutton()の戻り値に進みます。 十進数 二進数 押したボタン 1=00000001=↑ 2=00000010=↓ 4=00000100=← 8=00001000=→ 16=00010000=A 32=00100000=B 64=01000000=X 128=10000000=Y 押されたボタンによって、二進数の決まった桁が1になるのがわかりますね。
0そうだね
プレイ済み
返信[37]
親投稿
MIKI ifconfig
button() は押されている全てのボタンの桁を1にして返します。A と B が押されてたら 00010000 (=#A)と 00100000 (=#B)を合わせて 00110000 (=#A or #B) を返します。(おっと!! さりげなく or が出てきた!!) 例えば A と B と←と↑が押されてたら 00110101 が返ります。(=#A or #B or #LEFT or #UP) では、この時、A が押されてるかどうかを調べるにはどうすればいいでしょう?
0そうだね
プレイ済み
返信[38]
親投稿
MIKI ifconfig
その答え(の一つ)が、 「button() の戻り値と00010000 (=#A) の and を求める」 というものです。 上の 00110101 と 00010000(=#A) の and は 00110101 (=button()) 00010000 (=#A) 00010000 (=button() and #A) button() and #a が 0 でなければ、Aボタンが押されていたことがわかります。 Bと←と↑が押されていた場合、button() は 00100101 を返します。 00100101 (button()) 00010000 (#A) 00000000 (button() and #A) button() and #A が 0 なら、Aボタンは押されていません。
0そうだね
プレイ済み
返信[39]
親投稿
MIKI ifconfig
あ、00010000 = #A = 16 というのはいちいち書きませんでしたが、大丈夫ですよね? 00010000 は 16(十進数)の二進数表記 #A は プチコンの定数で 16(十進数) に等しいです。 ? #A 16
0そうだね
プレイ済み
返信[40]
親投稿
サクヤ cocoapple00
>みき★さん お返事遅れてしまってごめんなさい! ミーバースの表示がバグってて何も読めない状態でした(>_<) やっと正常に戻ったみたいなので、今から読ませていただきます。 そして読み込めてから改めてお返事させていただきますね。 いつもありがとうございます(*^^*)
0そうだね
プレイ済み
返信[41]
親投稿
サクヤ cocoapple00
コメント読み込みました! とてもわかりやすく教えていただいて、今までわからなかったのが嘘のようにすんなり理解できました♪ みき★さんの教え方とてもわかりやすいので、教えていただけて本当に有難いです(*^^*) 特に論理積と論理和の説明がわかりやすかったです。andとorがすぐにごっちゃになってしまってずっと混乱していたのですが、ようやく覚えられました。…それぞれの暗記はまだですが(^^;) あとbuttonでorが出たときに、一瞬うーと唸ってしまいましたが、buttonは押されたボタンの対応している数が1になるということですよね? でandで調べる。↑とAを両方押してるか調べたい時はand 10001でしょうか? #Aについては、実はまだ3.1.0からバージョンアップしていないのでよくわかっていませんが、多分それぞれのボタンの数値に対応しているってことですよね? #Bは32みたいな感じで。
0そうだね
プレイ済み
返信[42]
親投稿
MIKI ifconfig
> buttonは押されたボタンの対応している数が1になるということですよね? その通りです。 > ↑とAを両方押してるか調べたい時はand 10001でしょうか? そうです。が、二通りの判断があります。 (button() and 10001) == 10001 ⇔↑とAを共に押している (button() and 10001) != 0 ⇔ ↑またはAの少なくとも一つを押している > 多分それぞれのボタンの数値に対応しているってことですよね? そうです。普通の数字と同じように使うことも可能。 score=score+#b (キモチ悪いのでオススメしません!)
0そうだね
プレイ済み
返信[43]
親投稿
MIKI ifconfig
あ、そうそう!! プチコンで二進数を表記するには頭に &b を付けて &b10000 などと書きます。プチコンの整数は二進数で 32 桁なので、 &b10000000000000000000000000000000 とか書くことができます。 button() and &b10000 'A押されてるなら != 0 逆に数値を二進数で表記する方法は残念ながら用意されていません。
0そうだね
プレイ済み
返信[44]
親投稿
サクヤ cocoapple00
>(button() and 10001)==10001 うー、これ苦手なやつです(^^;) プログラムの勉強するときに、一番最初に前作の初心者講座を見たのですが、そこにボタンは『button and 16』と覚えればいいといったようなことが書いてあって、なるほどそうなのかと思っていたら、ミーバースでどなたかがそれじゃダメだ、==が云々~と言っているのを見かけて、え?==?と訳がわからなくなってしまって……。 えーと、頭から分解して考えていくと、『(button() and 10001)で↑とAが押されているかを調べている。 戻り値は00000か、00001か、10000か、10001。 他のボタンも押されていたとしても、and 10001で調べているから、他の値は帰ってこない。 で、両方押されていたら~と条件付けしたいので、==10001としている』であってます? ーつづくー
0そうだね
プレイ済み
返信[45]
親投稿
サクヤ cocoapple00
そして、!=0は、 戻ってくる値が上の4つだけだから、0でなければ↑かAのどちらかは押されている。 あれ? どちらか片方じゃなくて、両方押されている場合も、この条件で動きます? あと、&bのお話は、&b10001といった感じで、&bの後ろに二進法の数値を書くと、プチコンが「ああ、これは二進法ね」と理解してくれるって解釈であっています? そう言えば何もつけないと十進法との違いがありませんものね。プチコン側もわかってくれない(^^;) で、ええと、32桁というのは、プチコンの整数の最大値が32桁ってことですか? 確か2^31までとどこかに書いてあったような気がします。そのことでしょうか? 今回は特にわからない部分だったので、質問ばかりになってしまいました。 一度にこんなにたくさん聞いてしまってごめんなさいm(. .)m
0そうだね
プレイ済み
返信[46]
親投稿
MIKI ifconfig
>頭から分解して考えていくと 素晴らしいアプローチ方法です!! >他のボタンも押されていたとしても、and 10001で調べているから、他の値は帰ってこない。 その通りです。これを「10001 でマスクする」と言います。必要な桁だけマスキングテープで保護して、不要な桁は0で塗りつぶすイメージでしょうね。 >両方押されていたら~と条件付けしたいので、==10001としている 合っています。
0そうだね
プレイ済み
返信[47]
親投稿
MIKI ifconfig
>そして、!=0は(snip)どちらか片方じゃなくて、両方押されている場合も、この条件で動きます? その通りです。少なくとも片方が押されていれば1になります。 そういえばそれって論理和(or)の定義そのものでしたね。 片方だけが押された時に限って 1 にしたいという場合もありますよね。実はこの演算もプチコンには定義されてます。xor といいます。 表にするとこんな感じ。 x|y|x xor y -+-+------- 0|0|0 0|1|1 1|0|1 1|1|0 <--- or と違ってここが0になる。 日本語では「排他的論理和」。排他的ってのは、1 になれるのは一人だけって意味。x が 1 になったら y は 1 になれない。排他的ですねえww x xor y と x != y は同値です(x,yが一桁の場合)。
0そうだね
プレイ済み
返信[48]
親投稿
Godot orz_127
多分、みき★先生から、詳細な回答があると思いますが、まだっぽいのでとりあえず、簡単にw つづくの前、それで合っています。 !0は返ってくるのが&b10001、&b10000、&b00001、&b00000の4パターン、10進にすると17、16、1、0です。Aと↑は17なので!0で問題ないです。 &Bも合っています。&Bは2進数、&Hは16進数を書くときに明示的に頭につけます。&B10は2、&H10は16、何もつけない10は10w 32桁の話は32bit(4byte)とうい話だと思いますが…。 みき★先生にお任せしますw
0そうだね
プレイ済み
返信[49]
親投稿
Godot orz_127
のんびり書いていたら既にみき★先生の回答がw
0そうだね
プレイ済み
返信[50]
親投稿
MIKI ifconfig
Godot さんかぶってしまいましたねww >プチコンが「ああ、これは二進法ね」と理解してくれる その通りです。ちなみに&hを付けると「お、十六進数だ」と理解します。 >32桁というのは、プチコンの整数の最大値が32桁ってことですか? そろばんを考えてください。プチコンの整数とは珠が横に32個並んだそろばんです。普通のそろばんは一桁珠5個で0から9を表しますが、プチコンのそろばんは一桁珠一つでは 0 と 1 しか表せません。そして、この珠一つのことを 1 bit(ビット)といいます。 二進数で32桁⇔32bit となります。
0そうだね
プレイ済み
返信[51]
親投稿
MIKI ifconfig
>確か2^31までとどこかに書いてあったような気がします。 32桁(bit)使って、-2^31=-2147483648 から +2^31-1=+2147483647 までの整数を表せます。 -2^31 から -1 まで数えると 2^31 個の整数があります。0から2^31-1 まで数えると2^31個あります。 負の数が 2^31 個表せて、正の数が 2^31 個表せるので、足すと 2^31 + 2^31 = (2^31) * 2 = 2^32 個の整数を表せます。 ・・・期せずして符号付き整数と符号なし整数の話に戻ってきました。 ちょっと気合入れて書いてきますね。
0そうだね
プレイ済み
返信[52]
親投稿
Godot orz_127
符号付き、符号なしとか出てきたので注意事項をひとつ。 ビットシフト>>何げにやるとはまります。 今回はそこまでの話にはならないと思うので大丈夫かとw
0そうだね
プレイ済み
返信[53]
親投稿
MIKI ifconfig
あれ。そろばんの例えがミスリードっぽいな。 珠が横に32個並んでるんじゃなくて 「普通のそろばんは一桁に珠が5個で0から9を表すけど、 二進数のそろばんは一桁には珠が1個で、0か1しか表せない。 そしてこの一桁のことを 1 bit(ビット)といいます。 プチコンの整数はこれが32桁並んだそろばんです。」
0そうだね
プレイ済み
返信[54]
親投稿
Godot orz_127
>みき★先生 この際bitの話から 1byte=8bit 4byte=32bit の話にした方が分かりやすいのでは? 珠ひとつで32桁の算盤って? >サクヤさん 余談ですが、片手の指は5本なので5bit よって片手で指折り0~31まで数えられます。 あれ…? 28 で終わった。何処かで間違えた模様www 久しぶりにやったら指がつりそうw
0そうだね
プレイ済み
返信[55]
親投稿
MIKI ifconfig
Godot さん 五の珠だけのそろばんをイメージしてください。 五か九しか表現できないそろばんも売ってて、その名も「五か九そろばん」合格アイテムだそうです。これも一桁 1bit ですね。 新しい概念や用語がポンポン出てくると途端に難しくなるので、可能な限り普通の日本語で言い換えるようにしています。 bit ですら 3 晩目(?)にしてようやく出てきた。
1そうだね
プレイ済み
返信[56]
親投稿
MIKI ifconfig
例えば >他のボタンも押されていたとしても、and 10001で調べているから、他の値は帰ってこない。 これは新しい概念を自ら発見したのですよね。本当に素晴らしいことです。 概念が理解できているなら、それには実は名前が付いていますよ、「マスクする」と言うんですよ、と教えれば、ストンと腑に落ちて貰えるのではないかなあと思って、新しい用語を導入しました。 実は仕事で新しい概念と用語の津波にあっぷあっぷしているところで、真に難しいのは概念の理解で、概念を理解すれば、用語などは単なるラベルに過ぎないのだなあなどと思っているところです。 ですから、なるべく概念そのものを伝えられたらいいなあと思いながら書いているところです。
0そうだね
プレイ済み
返信[57]
親投稿
サクヤ cocoapple00
私も概念からきっちり覚えたい派なので、みき★さんの教え方は私には物凄くぴったり合っていてとても嬉しいです。有難いです(*^^*) 「マスクする」とても分かりやすかったです! xorについて。 えーとつまり、片方が1だったらそこが1になって、両方が1だったら0になるんですよね。 ってことは、実際使う場合は、 IF (BUTTON() XOR &B10001)== あれ? ==のあとは何になるんだろう……? 片方が、だから……。 あ! =!0でいいんですね。 これなら片方が1になるから意味が通りますね(^^) もしくは個別にボタンを指定したい場合は==&B10000で指定してしまう? でもこれなら IF (BUTTON() AND &B10001)==&B10000 でもAが抜き出せるから変わりませんね。あれ? ーつづくー
1そうだね
プレイ済み
返信[58]
親投稿
サクヤ cocoapple00
>x xor yとx!=yは同値 というのが難しいです。 両方1と0をパターンに分けて当てはめてみたので、同値になるのはわかったのですか、つまり実際使うときにはどうなるのでしょうか? 1桁で使うときにx xor yの代わりに、そのままx!=yに置き換えられるということですか? あれ? 二進数で1桁の時って、2から2桁になっちゃうから0と1の時だけ? 取りあえず、ボタンの時は1桁以上になってしまうから、この変換は使えないですよね? ーつづくー
0そうだね
プレイ済み
返信[59]
親投稿
サクヤ cocoapple00
そろばん、難しいです。 まず、何故-2^31から+2^31-1までなのでしょうか? 何故+の方に-1がついているのかが分かりませんでした。 あと、両方たして(2^31)*2なのに、玉が64個のそろばんではなく、32個のそろばんなのは何故でしょうか? 正の整数と負の整数、難しい……。 あ、そろばんの玉一つが1bitと言うのは覚えました♪
0そうだね
プレイ済み
返信[60]
親投稿
サクヤ cocoapple00
Godotさんもご回答ありがとうございました! 余談の件については今考えると混乱しそうなので、もう少し理解してから考えさせていただきますね(^^)
0そうだね
プレイ済み
返信[61]
親投稿
MIKI ifconfig
>IF (BUTTON() XOR &B10001)== >あ! =!0でいいんですね。 その通りです。 > もしくは個別にボタンを指定したい場合は==&B10000で指定してしまう? xor と同じ結果を得たい? ((button() and &b10001) == &b10000) || ((button() and &b10001) == &b00001) かな?? > 実際使うときにはどうなるのでしょうか? 実際には使いません(笑)。↓これを言いたかっただけです。 >1桁で使うときにx xor yの代わりに、そのままx!=yに置き換えられるということですか? ついでなんで、x と y の表の完全版を示しますね。
0そうだね
プレイ済み
返信[62]
親投稿
MIKI ifconfig
x,y (x,yは0か1) を与えると0か1を返す関数 f(x,y) の種類一覧です。 x|y|0123456789abcdef <-- この番号で説明します。 -+-+---------------- 0|0|0000000011111111 0|1|0000111100001111 1|0|0011001100110011 1|1|0101010101010101 0: 0 (x xor y) 1: x and y 2: x > y 3: x 4: x < y 5: y 6: x xor y (x != y) 7: x or y
0そうだね
プレイ済み
返信[63]
親投稿
MIKI ifconfig
x|y|0123456789abcdef <-- この番号で説明します。 -+-+---------------- 0|0|0000000011111111 0|1|0000111100001111 1|0|0011001100110011 1|1|0101010101010101 8: x nor y (not (x or y)) 9: x == y (not (x xor y)) a: not y b: x >= y c: not x d: x ⇒ y (x ならば y) (x <= y) (x imp y) e: x nand y (not (x and y)) f: 1
0そうだね
プレイ済み
返信[64]
親投稿
MIKI ifconfig
and, or, xor にもいくつかは名前が付いてますね。 nor: not or nand: not and 実は nand さえあれば、他の関数を全て実現できます。 例えば (x nand y) nand x は x⇒y になります。 imp: imply ならば 論理学では「x ならば y」は「1ならば0」の時だけ0になります。 (xが鳥)ならば(xは生物である)...(1) (xが鳥)=1 かつ (xは生物である)=0 の場合(1)が0になるのはいいとして (xが鳥)=0 かつ (xは生物である)=0 の場合(1)が1になるのが意外な感じですね。 以上ちょっと寄り道でした。
0そうだね
プレイ済み
返信[65]
親投稿
MIKI ifconfig
CPUの中では何でも bit の塊(bitの並び、bit列)として扱ってるのはいいですか? 整数も浮動小数点小数も文字もプログラムも画像も音声もみんな bit の塊。 よくコンピュータは二進数しかわからない、とか言うけど、二進数で表すと便利なことがあるってだけで、本質的に二進数であるという意味ではありません。 bit列、01の塊と言った方が実情にあってる。 あるbit列は数値を表すし、あるbit列は文字を表す、音声を表すといった具合です。 そのbit列を使う人(プログラム)が、このデータは数値だ文字だと解釈し、一貫してそのように扱うことで、同じbit列がいろんな物を表現できるのです。
0そうだね
プレイ済み
返信[66]
親投稿
MIKI ifconfig
我々はプチコン用のプログラムを書いて、プチコンに実行させますよね。 変数aはスコアを表し、変数bは残機を表す。 プログラムが一貫して矛盾なく変数aをスコアとして扱うことによって、それはスコアとしての意味を持つ。 プチコン自身はそれを知りません。 プチコンは変数が何を意味するのだろうと、プログラムに書かれた通り、aに100足したり、bから1引いたりするだけです。 プチコンと 3DS の関係も同じ事が言えます。 プチコンは今文字"A"(=chr$(65)をprintしたところだ。次の瞬間には変数aに65という整数を足した。 3DSのCPUから見ると、今 CPU が扱っている bit 列が、数値を表しているのか文字なのかなど全く知らない事です。 プチコンというスマブが作ったプログラムに書かれた通りにbit列 1000001 (=65)を操作しているだけ。
0そうだね
プレイ済み
返信[67]
親投稿
MIKI ifconfig
あ、訂正があった!! x|y|0123456789abcdef <-- この番号で説明します。 -+-+---------------- 0|0|0000000011111111 0|1|0000111100001111 1|0|0011001100110011 1|1|0101010101010101 ×0: 0 (x xor y) ○0: 0 (x xor x) (y xor y) 自分自身と xor を取ると常に 0 になります。これは多桁でも同じことなので、 a% = rnd(1e9): ? a% xor a% はいつも 0 を表示します。
0そうだね
プレイ済み
返信[68]
親投稿
サクヤ cocoapple00
表の完全版をありがとうございます! 一度に覚えきれなさそうだったので、書いていただいた表を手書きでノートにメモってみました(*^^*) そして正直に言うと、新しく出てきたの、特にdとeがさっぱりです! ええとまず、notは普通に「~ではない」でいいんですよね。 not xで、xではない。だから0-0と0-1の時に1。 と言うことで、x nand yは1-1以外が1。 と言うことまではわかったのですが、これが全部を表せるというのがよくわからないです。 あと、「ならば」。 まず⇒がならばの記号ってことですよね。そこまではわかったのですが、(x<=y)がxならばyと言うのがわからないです。 これがxならばyと言うなら、x>=y yは「yならばx」ですか? ーつづくー
0そうだね
プレイ済み
返信[69]
親投稿
サクヤ cocoapple00
>CPUの中は何でも bit の塊~ えーと、bitに関しては、最初のファミコンが発売当時8bit?だったけど、新しい本体が出るごとにbit数が増えてて、処理能力があがっているので絵がきれいになっているとか、そのくらいの一般ゲーマーくらいの知識しかないです(^^;) えーとつまり、bitの並び=bit列。 で、今まで教えていただいた01001011みたいな0と1の並びがbit列ということで合っていますか? で、3ds自体は命令に従って、これらのbit列を動かして(変更して)いるだけ。 それが画像であるとか文字であるとか決めているのは、そう定義付けしてくれてる?プログラムが動いていて3dsと人間の橋渡しをしてくれているから。 それらの橋渡しをしてくれているプログラムというのが、スマブさんが作ってくれたプチコンだったり……ということでしょうか?
0そうだね
プレイ済み
返信[70]
親投稿
サクヤ cocoapple00
あ、もうひとつ質問がありました! rnd(1e9)の1e9は、eが入っているので16進数の数値とかですか?
0そうだね
プレイ済み
返信[71]
親投稿
MIKI ifconfig
表全部覚える必要なくて、論理演算というと and, or, xor あたりが有名だけど、それらはこの16種類のなかの一つですよってことです。 訂正一つ ×and, or, xor にもいくつかは名前が付いてますね。 ○and, or, xor 以外にもいくつかは名前が付いてますね。 c: not x は、x=0の時 1, x=1の時0になります。yは関係ないです。 >nand で全部表せる 例えば x and y ⇔ (x nand y) nand (x nand y) not x ⇔ x nand x x or y ⇔ (x nand x) nand (y nand y) 頭の体操みたいですが、他のものも nand だけで作れるかチャレンジしてみて。
0そうだね
プレイ済み
返信[72]
親投稿
MIKI ifconfig
あと、「ならば」。 まず⇒がならばの記号ってことですよね。そこまではわかったのですが、(x<=y)がxならばyと言うのがわからないです。 x<=y というのは普通に「xはy以下」の意味ですよ。 x|y|x<=y 0|0|1 0|1|1 1|0|0 1|1|1 x⇒yと同値ですよね。同値というのはどっちで書いても同じって事、等しいから言い換えできます。 > x>=yは「yならばx」ですか? そうです。「ならば」という表記は日本語のイメージが強すぎるので、x⇒yとか x imp y と書いた方がいいかも。
0そうだね
プレイ済み
返信[73]
親投稿
MIKI ifconfig
>ファミコンが発売当時8bit ですね。3DSは32bitかな? >>CPUの中は何でも bit の塊~ 大体伝わったなと思います。 同じビット列も、解釈次第で異なるものを表現できるということです。 1000001 というビット列は 65 という数かもしれないし、"A"という文字かもしれない。 それはプログラムによって決まる、みたいな。 で、いよいよ符号無し整数と符号付き整数の話です。 ・・・というところで残り投稿が5になりました。 続きはまた明晩。
0そうだね
プレイ済み
返信[74]
親投稿
MIKI ifconfig
1e9 は 1 * 10^9 という浮動小数点小数です。 1e-9 は 1*10^-9 です。 あまり見かけないけど例えば str$ に大きな数を与えると ? str$(12345678910) 1.23457e+10 てなことになってしまったりします。
0そうだね
プレイ済み
返信[75]
親投稿
サクヤ cocoapple00
> d:x⇒y (xならばy) (x <= y) (x imp y) もしかして、()のものは「意味的に同じ」ではなく、全部まったくの「同値」と言う意味で並んでましたか? 昨日説明していただいたのと、あと表を見直したら同じ並びのものが一つもなかったので、そういう意味の表だったのかなと今更ながら気が付きました(^^;) あ、同値という言葉覚えました! >チャレンジしてみて チャレンジしてみました。 x⇒y ⇔(x nand y) nand x x>=y ⇔(x nand y) nand y こんな感じですか? >浮動小数点小数 あ、STR$を使ったときに見たことあります! STR$だと長い数値だと省略されちゃうから、長い数値の場合はFORMAT$を使った方がいいとかなんとか、どなたかが書かれているのを読んだことがあります。 >続きは明晩 楽しみにしてます(*^^*)
0そうだね
プレイ済み
返信[76]
親投稿
MIKI ifconfig
> ()のもの全部まったくの「同値」と言う意味 そうです。説明不足ですみません。 > x⇒y ⇔(x nand y) nand x > x>=y ⇔(x nand y) nand y 合ってます! さて整数の話ですが、 1bit あれば 0 か 1 の 2通りの値を表せます。 2bit なら各桁それぞれ 0 と 1 があるから 00 01 10 11 の 4 通り表せます。これを二進数としてみれば上から 0,1,2,3 (十進数表記) という数を表します(一対一対応がつけられる)
0そうだね
プレイ済み
返信[77]
親投稿
MIKI ifconfig
ここまで符号のことは考えてきませんでしたね。今まで二進数と言ってたのは全て符号無し整数のことだったのでした。 では、符号付きの整数はどうやって表すのかというと、同じ二進数なんだけど「少し違うやりかたで解釈する」方法を採ります。 最初の方で説明した二進数の位取りを思い出してください。右から、一の位、二の位、四の位、八の位、……と名づけたのでした。 符号付き整数として解釈するには同様に右から、一の位、二の位、四の位、八の位、……と名づけますが、一番左の桁にだけマイナスを付けます。 例えば abcd という 4 桁の二進数は位取りを一の位、二の位、四の位、マイナス八の位とし、 (-8*a)+(4*b)+(2*c)+(1*d) という値を表すと解釈します。
0そうだね
プレイ済み
返信[78]
親投稿
MIKI ifconfig
具体的に 3 桁(位取り={一、二、マイナス四})で考えましょう。 000 = -4*0+2*0+1*0 = 0(十進数) 001 = -4*0+2*0+1*1 = 1 010 = -4*0+2*1+1*0 = 2 011 = -4*0+2*1+1*1 = 3 100 = -4*1+2*0+1*0 =-4 101 = -4*1+2*0+1*1 =-3 110 = -4*1+2*1+1*0 =-2 111 = -4*1+2*1+1*1 =-1
0そうだね
プレイ済み
返信[79]
親投稿
MIKI ifconfig
できれば方眼用紙に、グラフを書いて欲しいところです。 縦軸(y軸)は -4 から 3 とし、横軸(x軸)は 0 から 7 とし、 x = 0, 1, 2,..,7 に対して、上記の最右辺の値のところに○を付けて下さい。 これが符号無し整数(横軸)と符号付き整数(縦軸)の関係になります。
0そうだね
プレイ済み
返信[80]
親投稿
MIKI ifconfig
か、書いてきた~~~
0そうだね
プレイ済み
返信[81]
親投稿
サクヤ cocoapple00
うーん、難しいです。 一日かけて考えてみたのですが、何が分からないのかがよく分からなかったので、もう一日考えさせてくださいませ(^^;) あ、整理するために、分からないと分かっている部分の質問だけさせてください。 まず、符号無しというのは正の整数のことで、符号有りというのは負の整数のことてで合ってますか? あ、0も符号無し? それとも、+1とかも符号がつくので、正の整数も符号有りになりますか? それと、八の位がマイナスになるというお話ですが、書いていただいた表には、十進法にはマイナスがついていますが、二進法の方にはついていませんよね。 実際使う場合は二進法にもマイナスの符号をつけるのでしょうか? -111みたいな感じで。 ーつづくー
0そうだね
プレイ済み
返信[82]
親投稿
サクヤ cocoapple00
あと、グラフを書いていただきありがとうございます! スクショということはプチコンで書いてくださったのでしょうか。 有難いです(*^^*) ですか、申し訳ないのですが、グラフの意味もよく分からなくて。教えてください。 まず、x軸の0~7と言うのはどこから出てきたのでしょうか? 000(十進法で0)~111(十進法で7)。ここからでしょうか? あと、最右辺に丸印というのもよく分からなかったです。 これは上の0~7について教えていただければ分かるかもしれませんが……。 y軸の3~-4は000~111の(-8*a)+(4*b)+(2*c)+(1*d)の3~-4のことですよね?
0そうだね
プレイ済み
返信[83]
親投稿
MIKI ifconfig
わからない点はどんどん聞いて下さい。 > 符号無しというのは正の整数のことで、符号有りというのは負の整数のことてで合ってますか? いきなりいい質問キタ!! あまり深く考えてませんでしたが、今後この説明中では「符号無し整数」「符号付き整数」は、ビット列の解釈方法のことを言うことにします。 > 二進法にもマイナスの符号をつけるのでしょうか? これもいい質問。この説明では、二進数表記はビット列そのものを表すことにします。故に符号は付けません。 そういう意味では下の式は等号で結ぶのはよくないですね。 100 = -4*1+2*0+1*0 「二進数 100 を符号無し整数として解釈すると -4*1+2*1+1*0になる」と書くのが正しい。
0そうだね
プレイ済み
返信[84]
親投稿
MIKI ifconfig
>x軸の0~7と言うのはどこから出てきたのでしょうか? 000~111を符号無し整数と解釈した時の値 0~7 です。 最右辺の値とは0,1,2,3,-4,-3,-2,-1のことでこれは ビット列000~111を符号付き整数と解釈した時の値です。 最右辺がどうしたというのは (0,0) (1,1) (2,2) (3,3) (4,-4) (5,-3) (6,-2) (7,-1) の点をプロットしてねという意味でした。 グラフの「符号あり」はビット列を符号付き整数として解釈した時の値、 「符号なし」はビット列を符号無し整数として解釈した時の値、になります。
0そうだね
プレイ済み
返信[85]
親投稿
サクヤ cocoapple00
>わからない点はどんどん聞いて下さい。 ありがとうございます! >今後この説明の中では~ この説明の中ではと言うことは、他の状況では「符号無し整数」などは違う意味を持ったりするのでしょうか? 今回は関係ないかもしれませんが、気になったので(^^;) >ビット列の解釈方法 つまり、前々回説明していただいた「CPUは01を扱っているだけ」で「こちら側が数値だったり文字列だったりと解釈している」ってお話の、解釈ってことですよね? それなら「二進数 100 を符号無し整数として解釈すると~」の部分もすんなり理解できますし、前回の説明の意味もわかってきました(^^) ーつづくー
0そうだね
プレイ済み
返信[86]
親投稿
サクヤ cocoapple00
そしてえっと、前々回の「最右辺の値」と言うのは、 000 = -4*0+2*0+1*0 = 0 という式?の一番右の=の右(最右辺)の数値(この行だと0)という意味だったのですね。 で、x=0,1,2…7に対して、○を付ける。 漸くあのグラフの書き方がわかりました♪ その上で、あのグラフを書くことで、何が分かったり、意味したりするのでしょうか? そこが分かりませんでした。
0そうだね
プレイ済み
返信[87]
親投稿
MIKI ifconfig
>他の状況では「符号無し整数」などは違う意味を持ったりするのでしょうか? 例えばC言語では変数などの「型」という意味で使います。 >「こちら側が数値だったり文字列だったりと解釈している」ってお話の、解釈ってことですよね? その通りです!! その前にも長々と解釈の話をしたのは、符号無し整数と符号付き整数の違いを説明するためだったんです。 基本的な言葉の定義のところで、私自身あいまいだったのでもやっとした説明になってしまいました。申し訳ない。 > という式?の一番右の=の右(最右辺)の数値(この行だと0)という意味だったのですね。 そうです。 一つは符号なし整数で解釈した値と、符号付き整数で解釈した値が、きちんと一対一対応しているということがわかるということ。 も一つは、縦軸にも符号無し整数を取ると(0,0)(1,1)...(7,7)の直線的なグラフになりますよね。そしたら相互変換とは、
0そうだね
プレイ済み
返信[88]
親投稿
MIKI ifconfig
片方のグラフをもう一方のグラフに変形することに他なりません。←これがそもそものゴールでした。 なお、相互変換できるのは一対一対応だからです。これがくずれたら不可能です。 (例の chr$(13) を chr$(10)に書き換えるというのは、ファイルと文字列の間の一対一対応を破壊するものでした。) それともうひとつ。グラフ化してみると式や数値だけでは分からないいろんな事が直観的に把握でき(たりし)ます。 プチコンでグラフ化は簡単ではないですが、なんだったらExcelやOpenOffice Calc でちゃちゃっとグラフ化してみると、いろんなインスピレーションが湧いてくるかもしれません。 昨日のコメで訂正一つ ×二進数 100 を符号無し整数として解釈すると ○二進数 100 を符号付き整数として解釈すると
0そうだね
プレイ済み
返信[89]
親投稿
MIKI ifconfig
2015/8/7コメ > まず、何故-2^31から+2^31-1までなのでしょうか? > 何故+の方に-1がついているのかが分かりませんでした。 32桁の二進数(abc...)を符号付き整数として解釈する方法 -2^31*a + 2^30*b + 2^29*c + ..... この式に由来することがお分かりいただけたでしょうか? 3bitで表せる数は (a) 符号無しなら 0 (000の場合)から 2^3-1 (111の場合)まで (b) 符号付きなら -2^2 (100の場合) から +2^2-1 (011の場合) まで ということになります。(b)で最小値が 111 の場合にならないのは、例のグラフを見れば明らかですよね。 32bitでも同じことになります。
0そうだね
プレイ済み
返信[90]
親投稿
MIKI ifconfig
あらら、引用が抜けてた。 「一つは」からのくだりは、 >あのグラフを書くことで、何が分かったり、意味したりするのでしょうか? への回答です。
0そうだね
プレイ済み
返信[91]
親投稿
サクヤ cocoapple00
す、すみません。相互互換という言葉がどこから出てきたのかが分かりません。一番最初のchr$(12345)のお話? えーと、一対一対応は「いちたいいち たいおう」と読むのであってますよね? で、符号無しと符号付きの値でグラフを書いた時、○が一つしか付かない。=一対一対応 ですか? chr(13)とchr(10)の破壊のお話は分かりました! 確かにオマヌケな仕様(もしくはバグ)ですね(^^;) あと、8/7のコメントのお返事も分かりました。 あんなに分からなかったのに、今日はあっさり分かりました! みき★さんの説明すごいです(*^^*) 今までの説明を踏まえると確かに-2^31から+2^31-1までですね。 ーつづくー
0そうだね
プレイ済み
返信[92]
親投稿
サクヤ cocoapple00
それと、(b)について。 一瞬混乱したのですが、グラフと式を合わせて見直したら、すんなり飲み込めました。 これが直感的に把握できるってことなんですね。 グラフがなかったら直ぐには理解できなかったと思います。 凄いですねグラフ化(^^)
0そうだね
プレイ済み
返信[93]
親投稿
MIKI ifconfig
話の流れは 1 文字列は位置次元配列として扱える 2 一つ一つの要素(つまり一文字)は16bitでできているので、符号無し整数として解釈すれば 0 ~ 2^16-1(=65535) までの整数を表せる 3 もし負の値も扱いたいのであれば、16bit を符号付き整数として解釈すればよい。その場合表せるのは -2^15(=-32768)~2^15-1(=32767)となる 4 ある16bit二進数を「(a)符号無し整数として解釈した値」と「(b)符号付き整数として解釈した値」を相互変換する関数を定義した 「4て何??」 ということでしたよね。 (a)と(b)は一対一対応してるので相互変換が可能というところまで進みました。 関数の内部に踏み込みますか? (Y/N)
0そうだね
プレイ済み
返信[94]
親投稿
MIKI ifconfig
一対一かそうでないかの図です。 厳密には数学用語なんで「全単射」という面倒な名前が付いてます。
0そうだね
プレイ済み
返信[95]
親投稿
サクヤ cocoapple00
お話の流れをまとめていただきありがとうございます。新しい内容を色々覚えているうちに混乱していたようです。すみません(^^;) 図も分かりやすかったです。ありがとうございます! あの、それで質問なのですが、 16bitというのはどこから出てきたのでしょうか? ずっと32bit(最近は3bit)でお話をしていたと思うのですが。うーん、まだどこかで混乱しているのか……分かりません。 6万~の数値は前から出てきましたが。 もしかしたら、最初の方で出てきた「文字列は2バイト」とかその辺りのお話でしょうか?
0そうだね
プレイ済み
返信[96]
親投稿
サクヤ cocoapple00
あ、書き忘れました。 >関数の内部に踏み込みますか? YES(*^^*)
0そうだね
プレイ済み
返信[97]
親投稿
MIKI ifconfig
整数配列は一要素が 32bit になります。なので 200x150x200という配列は確保できなかった。 文字列だと一要素が 16bit になるので 200x150x200 の配列と同等の領域を確保できた。 ということだったと思います。 一文字 16bit というのはプチコンの文字が utf-16 だからという理由ですが、utf-16だったらどんな文字でも 16bit か? というとそうでもないらしいです。文字コードの話は奥が深すぎて私自身も人に教えるほどの知識がないため、深入りできません。
0そうだね
プレイ済み
返信[98]
親投稿
MIKI ifconfig
風の噂ではコメントって100で打ち止めでしたっけ?? もし文字コードの話題に進むのであれば、新たな投稿でお願いします。 こちらでは、文字と16bitの二進数の間に一対一対応が成立するという前提で進めたいと思います。 あ、その前に余談になりますが、負の数を表す方法は、今まで説明してきた「符号付き整数」だけではありません。 例えば micsave では 8bit二進数を -128から127と解釈するようですが、00000000が-128で11111111が127に対応します。
1そうだね
プレイ済み
返信[99]
親投稿
MIKI ifconfig
これは3bitの例で言うと (0,-4)(1,-3)(2,-2)(3,-1)(4,0)(5,1)(6,2)(7,3) というグラフになります。 符号無し整数として解釈した値に-4を足しただけですね。 micsave で読む値は、0 から255(=2^8-1)に-128(=-2^7)を足した値ということになります。
0そうだね
プレイ済み
返信[100]
親投稿
MIKI ifconfig
まずプチコンの変数について 変数の型には、整数型、浮動小数点数型、文字列型の三種類があります。 整数型は 32bit で、smile basicは常に符号付き整数として解釈します。 -2^31から2^31-1までの整数を表すことができます。 浮動小数点数は 64bit で、「浮動小数点数」という今までの説明にない、新しい解釈方法で解釈されます。 これは 64bit を符号1bitと仮数部と指数部に分けて解釈し、 符号 * 仮数部 * 2の指数部乗 という形で小数を表します。 確認はしてないけど、IEEEという標準に則った解釈をしていると思います。 文字列型は一文字 16bit で、符号無し整数として解釈した時にその整数が utf-16 の文字コードを表すことになっています(多分)。
0そうだね
プレイ済み
返信[101]
親投稿
MIKI ifconfig
文字列の一文字に対して、asc() で文字コードを読むことができるし、chr$() で文字コードを文字として代入することもできる。一文字と16bit符号無し整数の間には一対一対応があるから、相互に変換できる。 では負の数も一文字と相互変換したいんだけど? という問題があって、 それを解決するために、16bit符号付き整数と16bit符号無し整数を相互変換する関数を作りました。 ところが!! ここで衝撃の事実が!! そもそも chr$() は32bit符号付き整数をエラー無く受け取ることができて、 しかもその数値を符号無し16bit整数に変換して文字にしてくれるようです。 (今気づいた) というわけで 16bit符号付き整数を16bit符号なし整数に変換する関数は、最初から不要だったみたいです。
0そうだね
プレイ済み