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)
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
6 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 6, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Shoutbox
gnysek (12:03, 18.01.18):
Akurat Nintendo nie zawodzi nigdy w takich sprawach.
I am Lord (11:37, 18.01.18):
i pewnie 90% nie działa bo to efekt montażu
Uzjel (0:57, 18.01.18):
Switch jest genialny, a to wygląda zajebiście
Chell (0:26, 18.01.18):
damn, jednak nintendo to nintendo
PsichiX (21:02, 17.01.18):
no i w tym roku nie bedzie nagrody za przyklad roku
MaxGaming (20:33, 16.01.18):
JUŻ MAM XD
MaxGaming (20:29, 16.01.18):
robię jakiś podstawowy błąd bo to jest banalna strona ale ja nigdy nie rozumiałem cssa, uczę się go bardziej na pamięć bo gdybym ja robił cssa wiele rzeczy zrobiłym zupełnie inaczej bo skupisko absurdów obecnie
MaxGaming (20:28, 16.01.18):
Ten mój css jest jakiś bardziej wadliwy niż myślałem. Jest ktoś chętny żebym mu wysłał na pw protą stronkę i mi powiedział co robię źle?
Chell (13:51, 15.01.18):
konkurentów masz dwóch
Wojo (11:50, 15.01.18):
Nie daję żadnego kurde
gnysek (10:43, 15.01.18):
Kurde, w temacie na przykład roku nie mogę głosować, bo albo na siebie albo na jedynego konkurenta...
gnysek (10:43, 15.01.18):
Ja nie widzę czegoś takiego, aleeeeee może masz niekompletny profil usera
Chell (22:46, 14.01.18):
oczywiście to był żart, nic nie ustawiałem, zachęcam do głosowania
Chell (21:22, 14.01.18):
oddałem swoje głosy i ustawiłem przekierowanie, w tym roku to ja rozdaje karty
Ignatus (21:18, 14.01.18):
Ciekawe Nie można wejść na żaden z tematów [głosowanie] bo ładuje się zawsze strona o treści "Następny krok: Optional Profile Information" i nic więcej...
ANtY (13:59, 14.01.18):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargh
Uzjel (19:23, 13.01.18):
To MaxGaming, fake konto Paqa.
Uzjel (15:51, 13.01.18):
Moduł Androida za darmo do testów do końca miesiąca (GMS2)
Wojo (12:21, 13.01.18):
Odszedłeś bezpowrotnie z twoją muzyką.
Wojo (12:20, 13.01.18):
lil peep czemu to zrobiłeś ja pierole
Chell (8:21, 13.01.18):
no dobra, nie przemyślałem tego
gnysek (8:49, 12.01.18):
Ale to jest własnie własciwość focusu, ze jest na jednym elemencie. Inaczej to juz nie focus
ANtY (22:02, 11.01.18):
Fullscreen Windowed
Chell (20:08, 11.01.18):
w sensie zebym mial sobie gierke na full screenie na glownym, powiedzmy walkthrough na drugim i zebym mogl sie przelaczac miedzy tymi dwoma tak, zeby gra nie gubila focusu
Chell (20:08, 11.01.18):
jest jakis soft pozwalajacy na osobny focus na kazdym monitorze?
I am Lord (19:26, 11.01.18):
Sahara w krakowie?
Uzjel (21:11, 10.01.18):
Ahhh... Obejrzałem właśnie walki robotów. Fajnie było
gnysek (10:53, 10.01.18):
problemy z monetyzacją - wszyscy wrzucali darmowe rzeczy, a nikt nie płacił za miejsce - woleli cwaniakować i kilka kont zakładać.
I am Lord (21:56, 9.01.18):
A co się stało z tymi serwisami?
Morro (14:28, 9.01.18):
nie polecam nikomu ;d
Morro (14:28, 9.01.18):
wjeżdzą na banię, dopiero dzisiaj od piątku przespałem koło 8 godzin ciągiem
gnysek (7:51, 8.01.18):
chociaz pb to chyba tylko żąda kasy i zdjęć nie skasował, ale imageshack chyba po prostu wywalił serwery przez okno
gnysek (7:50, 8.01.18):
wrzuta, fotka, wiele serwisów. Najgorsze że imageshack i photobucket też, sporo contentu w sieci straciło treść bezpowrotnie.
Korodzik (1:02, 8.01.18):
huh, ja wrzutę pamiętam głównie jako magazyn pirackich muzyczek, bodajże w czasach zanim na youtube można było znaleźć dowolny utwór świata
Chell (20:38, 7.01.18):
wlasnie zauwazylem ze wrzuta.pl zniknela, a wraz z nia masa dobrej polskiej muzyki :/
I am vader (20:29, 7.01.18):
Informatycznie led.feen.us/fp8ox1id.png
Chell (18:15, 7.01.18):
w ogóle tak mi się teraz przypomniało jak byłem małym 4tk i na gmclanie funkcjonowały acziki. jeden z nich był za "wypicie pół litra sam na sam z shoutboxem", i jak wiedziałem co to pół litra, tak nie miałem pojęcia jak można je wypić z shoutboxem. dobre, beztroskie czasy
Nikas (14:55, 7.01.18):
Też raz w gimbazie widziałem. Byłem z rodzicami nad jeziorem i jakieś młode łebki się najebały i ukradły rowerek wodny w nocy. Jeden typ jakoś wypadł do wody i się nie wynurzył. Nurkowie go wyciągnęli jakieś 2 dni później. Mało przyjemny widok to był.
I am vader (14:43, 7.01.18):
Czy tylko ja trupa tutaj nie widzialem?
ANtY (14:03, 7.01.18):
nie wiem czy to taki lol
Wojo (9:40, 7.01.18):
lol xD
Chell (23:39, 6.01.18):
i no pilem do tego ze tez wtedy pol nocy nie spalem bo mi zle z tym bylo strasznie
Chell (23:39, 6.01.18):
pierwszy podbieglem, ale troche mnie zamurowalo jak zobaczylem pusty wzrok i struzke z glowy, tak se stalem i myslalem czy wskakiwac po niego czy nie, bo mam nowe buty, dopiero po jakichs 5 sekundach kumpel mnie zawolal
Chell (23:37, 6.01.18):
kiedys ok. polnocy przechodzilem obok fontanny wolnosci w Poznaniu (9 metrow wysokosci), koles spadl ze szczytu, w polowie zahaczyl o metalowy stelaz fontanny, obrocil sie glowa w dol, wyjebal w deski i zsunal sie do wody
Chell (23:35, 6.01.18):
also Morro przykro mi, takie rzeczy dziwnie wjezdzaja na banie
Chell (23:13, 6.01.18):
caly dzien wisi temat z nominacjami i nikt sie nie zainteresowal, juz nawet nie ma co umierac na tym forum
Wojo (19:55, 6.01.18):
tyle nocyy
Uzjel (16:45, 6.01.18):
Dzięki @ANtY Powinno być już ok
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

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

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