HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1013
チャーくん演算子3解決


チャーくん

リンク

2014/10/13(Mon) 16:53:04|NO.65537


mref vram,66 color 255,0,128 boxf 10,40,300,500 redraw 0 repeat ginfo_winx*ginfo_winy-(ginfo_winx*ginfo_winy)/4 vram(cnt)^=-1 loop redraw
これを実行すると、色の反転が一瞬にしてできるはずです。
これの、ループの中の

vram(cnt)^=-1
って、どういうことなのでしょうか?
いまだに演算子のことが理解できません。



この記事に返信する


kanahiron

リンク

2014/10/13(Mon) 17:41:00|NO.65538


font msgothic,16 mes "基礎知識\t数字の頭に0xがつくと16進数表記、0bとつくと2進数表記" mes "\t\tHSPの整数型と呼ばれているものはC言語でいうsigned longint型\n" mes "ビット演算子 ^ はxorを表す" mes "xorは、比較するbitが異なると0、同じだと1を返す" mes "つまり、 0b01と0b10だと両方共異なっているので0b11を返す" mes "0b11と0b11だと両方同じなので0x00を返す" mes "0b10101010 xor 0b11111111 = 0x01010101となる" mes "16進数表記だと 0xAA xor 0xFFになる\n" mes "signed longint型だと変数は4B(バイト)、32bit(ビット)である" mes strf("-1を signed long int型で見ると\t0x%p",-1) mes "ここで先程の\"0x10101010 xor 0x11111111 = 0x01010101\"を見ると、\nビットが反転しているのがわかる" mes "つまり、-1(0xFFFFFFFF)でxorをするとビットが反転し、notを同じことをしてる" mes "しかしHSPではnot演算子は無いのでこのような回りくどいやり方になる\n" mes "以下検証\n" a = 0x0000FFAA mes strf("変数aは\t\t\t\t0x%p",a) b = a^-1 mes strf("変数aと-1でxorすると\t\t0x%p",b) mes {" 0xFF = 255 0xAA = 170 255 - 170 = 85 85 = 0x55"} mes "また、 a ^= -1 と a = a^-1 は同じ"
適当に書いてみたので、エディタに貼っつけて実行して読んでみてください



cats

リンク

2014/10/13(Mon) 17:48:36|NO.65539

^ は XOR という演算子です。
XOR(排他的論理和)については
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
が成り立ちます。
例えば
0101 ^ 1111 = 1010
となります。
VRAM(cnt) ^= -1 は VRAM(cnt) = VRAM(cnt) ^ -1 と等しいですね。
いくつかの数に対してXOR-1を試してみてください。そうするとよく理解できると思います。
XORは他の論理記号と同じくよく使います。
NOT, AND, OR, XOR や演算記号、またシフト演算なども知っておくと便利です。



チャーくん

リンク

2014/10/13(Mon) 18:40:11|NO.65541

いままでわからなかったのが不思議なくらいわかりました。
ありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.