Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy GML
Treść artykułu
Operatory bitowe
autor: Platyna (14.02.10) | czas czytania: 5 minut, 19 sekund
W komputerze każda informacja zapisywana jest przy pomocy kodu binarnego (dwójkowego) składającego się jedynie z zer i jedynek. Przykładowo liczba 2 reprezentowana jest przez następujący ciąg: 10, a liczba 5 przez: 101. Jest to dość intuicyjne, po prostu wyobraźmy sobie, że istnieją jedynie te dwie cyfry. Wtedy bo 1 następuje 10. Kolejne pierwsze liczby w zapisie binarnym wyglądają więc tak:
1: 1
2: 10
3: 11
4: 100
5: 101
6: 110
7: 111
8: 1000
itd.
Mam nadzieję, że jest to zrozumiałe. Nie będę się zagłębiał w temat zapisu binarnego, bo nie o tym ma być ten artykuł.

GameMaker poza zwykłymi operatorami arytmetycznymi takimi jak +, -, * lub / oferuje nam również operatory działające na zapisie binarnym liczb. Należą do nich:
kod:

| - OR bitowa suma logiczna (alternatywa)
& - AND bitowy iloczyn logiczny (koniunkcja)
^ - XOR bitowa różnica symetryczna
<< - przesunięcie w lewo
>> - przesunięcie w prawo
~ - negacja bitowa


Poniższe tabelki przedstawiają jakie wyniki zwracają poszczególne operatory dla danych argumentów. Za moment każdy z nich zostanie dokładniej omówiony.


| - bitowa suma logiczna (alternatywa)

Działa analogicznie do operatora logicznego ||. Operator ten przyjmuje jako argumenty 2 liczby. Następnie sprawdza wartości ich kolejnych bitów. Jeśli chociaż jeden z nich jest równy 1 to odpowiedni bit liczby wynikowej będzie miał wartość 1.
kod:

Przykład:
105 1101001
45 0101101
105 | 45 1101101



Jak widzimy jedynie 2 bity pozostały zerowe ponieważ tylko na 2 pozycjach obie liczby miały zerowy bit. Powstała w wyniku tej operacji liczba to 109.

& - bitowy iloczyn logiczny (koniunkcja)

Ten operator jest bitowym odpowiednikiem operatora logicznego &&. Działa bardzo podobnie jak omówiony przed chwilą operator |. Różnicą jest to, że wynikowy bit ma wartość 1 jedynie wtedy gdy odpowiednie bity obydwu liczb podanych jako argument są równe 1.
kod:

Przykład:
105 1101001
45 0101101
105 & 45 0101001



Powstała liczba to 41. Operator ten, może posłużyć nam do obliczenia reszty z dzielenia przez 2. Jeśli dowolną liczbę potraktujemy tym operatorem jako drugi argument podając liczbę 1 to uzyskamy właśnie resztę z dzielenia przez 2.
kod:

Przykład:
105 1101001
1 0000001
105 & 1 0000001


Na pierwszy rzut oka widać, że wszystkie bity poza ostatnim muszą zostać wyzerowane. Dzieje się tak dlatego, że liczba 1 ma tylko jeden bit równy 1. Wiadomo, że liczba jest podzielna przez 2 jeśli jej ostatni bit jest równy zero. Trudno się z tym nie zgodzić. Jeśli więc będzie podzielna przez 2 ostatni bit wynikowej liczby będzie równy 0, a więc cała liczba również będzie równa 0. W przeciwnym wypadku wynikiem będzie 1. Taka operacja jest znacznie szybsza od zwykłego dzielenia modulo.

^ - bitowa różnica symetryczna

Ten operator działa podobnie do dwóch poprzednich. Tutaj jednak wynikiem jest 1 gdy dokładnie jeden z argumentów ma wartość 1. Jest to równoważne temu, że odpowiednie bity się od siebie różnią.
kod:

Przykład:
105 1101001
45 0101101
105 ^ 45 1000100


Powstała liczba to 68. Operator ten ma ciekawą własność. Mianowicie operacja ta jest odwracalna. Gdybyśmy teraz liczbę 68 potraktowali operatorem ^ i jako drugi argument podali 45 to otrzymali byśmy z powrotem 105. Można wykorzystać tę własność do prostego szyfrowania danych. Wystarczy każdy bajt XORować z jakimś kluczem. By odszyfrować dane wystarczy je przeXORować z tym samym kluczem.

<< - przesunięcie w lewo

Operator ten również przyjmuje 2 argumenty. Jego działanie jednak znacząco różni się od przedstawionych przed chwilą trzech operatorów bitowych. Pierwszy argument to liczba poddawana operacji, drugi to wartość przesunięcia. Operator ten przesuwa wszystkie bity danej liczby o daną wartość w lewo, a w powstałych miejscach po prawej wstawia 0.
kod:

Przykład:
5 0000101
5 << 3 0101000

W wyniku tej operacji powstała liczba 40. Nie trudno zauważyć, że jest to nic innego jak mnożenie przez kolejne potęgi dwójki. Oczywiście przesunięcie o 30 bitów w lewo jest znacznie szybsze niż 30-krotne wymnożenie liczby przez 2.

>> - przesunięcie w prawo

Działanie niemal identyczne jak w przypadku poprzedniego operatora. Tutaj jednak wszystkie bity przesuwane są w prawo, a z lewej strony pozostają nam zera.
kod:

Przykład:
45 0101101
45 >> 3 0000101

W wyniku powstała liczba 5. Można zauważyć, że w przypadku tego operatora kilka skrajnych bitów po prawej stronie zostaje utraconych. Dzięki temu zjawisku przesunięcie w prawo okazuje się równoważne całkowitoliczbowemu dzieleniu przez potęgi 2! Sprawdźmy to.
kod:

45 / 2 = 22.5
22 / 2 = 11
11 / 2 = 5.5

45 / 2^3 = 45 / 8 = 5.625

Zgadza się! Każda utracona w zapisie binarnym jedynka jest to zgubiona część po przecinku.
Dodatkowo teraz wyciągając resztę z dzielenia przez 2 możemy uzyskać wartość konkretnego bitu początkowej liczby.

~ - negacja bitowa

Pozostała nam do omówienia jedynie negacja bitowa. Ten operator jest wyjątkowy ponieważ jest jednoargumentowy. Liczba będąca wynikiem tej operacji jest utworzona przez zamianę wszystkich 1 w zapisie binarnym na 0, a wszystkich 0 na 1.
kod:

Przykład:
45 0101101
~45 1010010

Powstała nam liczba -46. Może wam się to wydać nieco dziwne. Jest to spowodowane tym, że aktualnie większość komputerów korzysta z systemu reprezentacji liczb całkowitych U2. Nie będę dokładnie wyjaśniał na czym on polega, bo jest to materiał na nowy artykuł, ale powiem w skrócie. Każda liczba posiada jeden dodatkowy bit znajdujący się na początku i określający czy liczba jest dodatnia (0) czy ujemna (1). Tak więc w rzeczywistości dla komputera 1001 to nie jest 9, a -7. 9 natomiast wyglądałoby tak: 01001. Dzięki takiemu sposobowi zapisu negacja zyskuje pewną ciekawą właściwość. Mianowicie: ~X == (-X-1).
Nietrudno zauważyć, że negacja jest operacją odwracalną, czyli: X == ~(~X).


I to by było na tyle. Możliwe, że wielu uzna operatory bitowe za zbędne, ale w niektórych przypadkach naprawdę się przydają. Przykładowo przy implementowaniu Drzew Potęgowych przy pomocy prostej linijki x-(x&(x-1)) cała skomplikowana struktura sprowadza się do 5 linijek kodu. A nieprawdopodobne jest w jaki sposób to działa :D

Dziękuję za uwagę : )
głosów: 9 | ocena: 8.56 oceń zasób | dodał: Platyna
Komentarze
stron: 1

1


av

gnysek (19:38, 14.02.2010)

Warto zauważyć, że np. mnożenie razy 10 to np. (a<<3)+(a<<1). Taka ciekawostka.
Zabrakło tabelki dla AND, OR, XOR, NOT z algebry boola

av

Platyna (19:55, 14.02.2010)

Słuszna uwaga! Tabelki dodane

av

gnysek (19:56, 14.02.2010)

Daj je na początku, przed or

av

Snake (22:44, 16.02.2010)

Dobry artykuł. Można by jeszcze wspomnieć o operatorach |=, &=, ^=, braku >>=, <<= i o tym, że GM-owy real ma 64 bity a poprawnie operować można jedynie na tych 32 mniej znaczących

av

Platyna (23:22, 16.02.2010)

No niestety to jest problematyczne. Mógłbym mój przykład licznika przerobić by używał własnej arytmetyki, bo się wykrzaczał na dużych liczbach, ale to by znowu początkujący nie zrozumieli i by się z celem mijało

Co do operatorów to jakoś mi umknęły z pamięci, bo z helpem sprawdzałem czy o niczym nie zapomniałem, a tam ich nie było.

av

Makary155 (15:33, 17.02.2010)

A w czym nam może pomóc, zwykłym śmiertelnikom ten art?

av

Slash (Pental) (15:35, 17.02.2010)

W operacji na bitach? Nie jestem pewien, strzelałem..

av

Easeful (17:29, 17.02.2010)

praktycznie nie jest to potrzebne, ale art jest bardzo dobry i przybliżył mi działanie tych bitów 10/10

av

Platyna (17:40, 17.02.2010)

Może w GMie faktycznie nie są zbyt potrzebne, ale w chociażby w C++ się przydają.

Może jeszcze jakiś przykład zastosowania... O wiem. Możemy w bardzo prosty sposób wygenerować wszystkie podzbiory jakiegoś zbioru. Tworzymy sobie inta w którym kolejne bity odpowiadają kolejnym elementom zbioru. Jeśli dany bit ma wartość 1 to element bierzemy, a jeśli 0 to nie. Zwiększając te liczbę o 1 generujemy kolejne podzbiory od pustego po wykorzystujący wszystkie elementy. To może być przydatne gdy każdemu możliwemu podzbiorowi chcemy przyporządkować jakąś komórkę tablicy na przykład.

av

Slash (Pental) (17:41, 17.02.2010)

Każdy zrozumiał, o co chodzi ..

av

gnysek (18:22, 17.02.2010)

No ale jak używasz np. 39dll, to art się bardzo przyda tak samo jak operujesz na plikach

av

pablo1517 (6:48, 23.02.2010)

Ja szczerze mówiąc dalej nie rozumiem jak można by to zastosować w 39dll xD

av

Dawidds (7:39, 23.02.2010)

pablo, jak masz do wysłania np. 2 zmienne 0-15 to zamiast je wysyłać osobno możesz je spokojnie upchnąć w jeden bat

av

gnysek (16:26, 23.02.2010)

Albo jak mam 8 zmiennych true/false Nawet jest taka funkcja buildbyte w 39dll

av

pablo1517 (12:24, 26.03.2011)

Ciekawostka, XOR pozwala na zamienienie zmiennych miejscami, tzn. Jeśli mamy a i b, i chcemy by a przybrała wartość b, i b przybrała wartość a, to z reguły ludzie tworzą sobie 3 dodatkową zmienną pomocniczą. XOR pozwala się bez niej obyć.
a=a^b;
b=a^b;
a=a^b;
I już zamienione

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
2 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 1, ukrytych: 0
Misiek999
Użytkownicy na czacie discord
gnysek (13:58, 18.02.19):
bo tam są głównie XMLe, wiec kazdy edytor do www się nada
gnysek (13:58, 18.02.19):
ja otwierałem w phpstormie i robiłem replace
nowy_user (13:45, 18.02.19):
BTW. Na forum YoYo coraz większe naciski ze strony użytkowników. Podoba mi się to, że użytkownicy wywierają presję na Yoyo, aby produkt i forum dalej się rozwijały. Nie podoba mi się natomiast to, że Yoyo samo nie wychodzi z inicjatywą :/
nowy_user (13:44, 18.02.19):
Dzięki za info, postaram się jeszcze pokombinować z GMEdit , może tam będzie ta opcja.
gnysek (13:28, 18.02.19):
a faktycznie, nie ma globalnego replace, to w GMS2 tylko, trzeba robić globalny find i ręcznie zmieniać
nowy_user (10:30, 18.02.19):
Niestety, w edit jest opcja Find a resource (Ctrl+R) ale to pozwala wyszukiwać np. całe obiekty sprity itd. Nie do końca mi o to chodziło. To, co ja bym chciał zrobić to np. podmienić nazwę jednej zmiennej, która jest dość nieintuicyjna, a pojawia się bardzo często, i jest porozsiewana po różnych obiektach i skryptach. Chciałbym móc podmienić nazwę tej zmiennej we wszystkich miejscach, za jednym zamachem...
gnysek (10:05, 18.02.19):
wejdź do menu "Edit" i tam chyba będzie, wraz ze skrótem.
nowy_user (9:24, 18.02.19):
Panowie, prosta sprawa, nie wiem czy czegoś nie widzę przez jakieś chwilowe zaćmienie umysłu, ale gdzie w GM1.4 jest opcja globalna 'search and replace' ? Lokalnie, dla danego obiektu pojawia sie po wciśnięciu ctrl+F , natomiast globalnie, jak wcisnę ctrl+shit+F to pojawia się sama wyszukiwarka, bez opcji replace... Chciałem zmienić nazwę jednej zmiennej, chyba nie będę musiał tego robić ręcznie?
Konrad-GM (0:12, 18.02.19):
Yup, dokładnie tak powinno chodzić, potem jest trochę więcej różnorodnych pułapek, więc robi się coraz trudniejsze
I am Lord (0:06, 18.02.19):
ale aż tak? www.youtube.com...eature=youtu.be
Konrad-GM (23:58, 17.02.19):
Ten kurczak szybko chodzi, więc to ficzer jest, żeby za łatwo nie dało się przejść gry
I am Lord (23:52, 17.02.19):
ok teraz 8, ale nie wiem czy u mnie czasem nie za szybko chodzi ten kurczak
I am Lord (23:50, 17.02.19):
5 jajaec zdobyłem
I am Lord (23:46, 17.02.19):
12 minut zostało a nie mam game playu jeszcze tylko sama grafika
I am Lord (23:46, 17.02.19):
ja nie zdąrze
Konrad-GM (23:41, 17.02.19):
Dodałem grę na ligę, ale zczaiłem się dopiero teraz, że czarny kolor to przecież też kolor kek, nie bijcie
gnysek (10:35, 15.02.19):
jak jeszcze gdzieś zostały, dawajcie znać
I am Lord (17:40, 14.02.19):
to się nie sprawdzi przy takiej małej ilości osób. Żadne posty się nie gubią tutaj w tłumie żeby je wyróżniać
I am Lord (17:40, 14.02.19):
wyłącz te oceny
gnysek (10:29, 14.02.19):
jeszcze wieczorem zajrzę w kod, jak nie znajdę żadnej opcji to wyłączę ocenianie w tych działach i tyle, i tak mało kto tego potrzebuje, to nie stackoverflow
gnysek (0:46, 14.02.19):
musiałbym chyba wyłączyć oceny
nowy_user (20:43, 13.02.19):
To prawda, jest to irytujące.
I am Lord (20:11, 13.02.19):
da się wymusić żeby to cholerne sortowanie po ocenie postu nie było domyślne? Straszliwie mnie wnerwia
gnysek (11:50, 13.02.19):
tzn. wcześniej też na forach się sporo działo, ale nie miałem internetu to nie widziałem
gnysek (11:49, 13.02.19):
Pamiętam, lata 2003-2008 to chyba takie najbujniejsze. Aż weszły facebooki i smartfony.
Temporal (17:18, 12.02.19):
jestem człowiekiem starej daty i żyje czasami, gdy wszystko działo się na forach internetowych
Temporal (17:17, 12.02.19):
wiem co to Discord, tak tylko głupoty wypisuje
I am Lord (17:12, 12.02.19):
discord to chat a nie portal społecznościowy
I am Lord (17:05, 12.02.19):
bo rozmowy się toczą na discordzie tylko
Temporal (16:51, 12.02.19):
boję się Discordów, Facebooków i Instagramów
SimianVirus7 (22:59, 11.02.19):
tu zwykle jest cicho z tego co wiem na discordzie więcej się dzieje
nowy_user (15:37, 11.02.19):
Wszyscy piszą gry, nik nie ma czasu na pogawędki
Temporal (15:33, 11.02.19):
co tu tak cicho?
nowy_user (17:20, 9.02.19):
Morał z tych historii: Róbcie backupy
Temporal (15:39, 9.02.19):
brzmi jak dobra copypasta
Konrad-GM (14:59, 9.02.19):
Kiedyś robiłem grę w Unity, crash co chwila, a potem ostatni crash usunął mi sporą część assetów w jakiś dziwny sposób, że nie mogłem odzyskać większości kodu czy modeli a kopia mocno była nieaktualna, usunąłem Unity i od tamtej pory nigdy nie wróciłem xD
I am Lord (13:52, 9.02.19):
miałem strzelankę topdown z generowanymi jaskiniami w planach
I am Lord (13:51, 9.02.19):
Ja nie oddałem na ligę bo mi crash GMS2 zepsuł projekt i się wkurzylem. Odinstalowałem go
Temporal (10:13, 9.02.19):
kiedy ten GM mi się znudzi? cały czas jestem pod wrażeniem jak dobry jest ten soft. Oczywiście ma jakieś swoje bolączki i są bardziej zaawansowane silniki, ale to wciąż doskonałe narzędzie zarówno dla początkujących twórców gier jak i zaawansowanych. Tworzenie gier w tym środowisku to sama przyjemność
gnysek (22:03, 8.02.19):
Nie wyjdzie. Jest plan na cały rok rozpisany i nie ma tam gms3. A zniżki były co roku.
nowy_user (18:22, 8.02.19):
Pojawiła się nowa promocja, Lunar Sale, nawet do 50% zniżki na GMS2 Mobile. Chyba niedługo wyjdzie GMS3, skoro co chwila nas zasypują promocjami
nowy_user (22:05, 5.02.19):
Dzięki, wyglada bardzo solidnie, chyba z niego skorzystam
gnysek (17:03, 5.02.19):
mydevil.net po tym jak hekko ceny podniosło
nowy_user (14:40, 5.02.19):
Hej, jaki niedrogi i dobry hosting polecacie do prostego landing Page’a, na którym mógłbym zaprezentować apkę zrobioną w GM? Najlepiej taki, który obsługuje WordPressa, bo bardzo do gustu przypadła mi wtyczka Elementor Page Builder
Sutikku (22:58, 4.02.19):
dziury w głowie
Sutikku (22:58, 4.02.19):
zapomniałem skończyć gierkę na lige .-.
SimianVirus7 (17:35, 4.02.19):
Myślę, że parę dobrych duszyczek by się znalazło i ufundowało nagrody. Jeśli pomysł się spodoba, ja również mogę dorzucić coś od siebie
SimianVirus7 (17:33, 4.02.19):
Można by zrobić jakiś worek gier (ale nie śmieciowych). Human: fall flat, Hollow Knight, Bioshock Inifite, Gothic Universe Edition. To wszystko dobre gry za małą cenę <20zł
Dester (17:13, 4.02.19):
nagrody na Steam na pewno były by bardzo motywujące
Dester (16:53, 4.02.19):
temat był za trudny
Ankieta
» Ile powinny trwać tury Ligi 24?
24h
48h
54h (piątek od 18:00)
7 dni
inna długość (podałem w komentarzu ankiety)

GMCLAN to serwis o programie Game Maker i nie tylko.
[ Polityka prywatności ]
Copyright © 2002-2019. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2019 {=|=} fable_inside();

[ Czas generowania strony: 0.02922 sekund ] [ Liczba zapytań MySQL: 13 ]