Pythonban mik ezek a bináris műveletek?
win7 Python3.7 Idle
x = 60 # 60 = 0011 1100
y = 13 # 13 = 0000 1101
w = x & y; # 12 = 0000 1100
print("Line 1 - Value of w is",w)
w = x | y; # 61 = 0011 1101
print("Line 2 - Value of w is",w)
w = x ^ y; # 49 = 0011 0001
print("Line 3 - Value of w is",w)
w = ~x; # -61 = 1100 0011
print("Line 4 - Value of w is",w)
w = x << 2; # 240 = 1111 0000
print("Line 5 - Value of w is",w)
w = x >> 2; # 15 = 0000 1111
print("Line 6 - Value of w is",w)
Azt látom, hogy az adott szám bináris alakjában változtatott valamit. De pontosan milyen műveletek ezek? Pl 10-es számrendszerben hogyan lehet értelmezni ezeket a műveleteket? Milyen műveletet kell végezni pl. a 60-nal és a 13-mal, hogy 12-t kapjunk? Úgy is mondhatnám, hogy hogyan lehetne decimális műveletté alakítani őket? Illetve ezeket a nem szokványos műveleteket mikor kell használni?
Köszönöm a válaszokat.
Output:
Line 1 - Value of w is 12
Line 2 - Value of w is 61
Line 3 - Value of w is 49
Line 4 - Value of w is -61
Line 5 - Value of w is 240
Line 6 - Value of w is 15
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Csak bináris formában értelmezhetők, Boole-algebra a neve.
A hagyományos Boole algebrában az igaz és hamis értékekkel végeznek műveleteket, ami az informatikában a bináris 1-nek és 0-nak felel meg.
Leginkább hardverközeli vagy azt imitáló műveleteknél lehet használni, ott megvan az egyes műveletek funkciója, hogy milyen bitmanipulációkra melyiket lehet használni. Decimális értékre nincs is értelme átváltani.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Ezek azok a bitműveletek:
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
Azért van itt baj a felpontozott válaszkban! Aki nem ért hozzá, minek szól bele? Ez nem telefon.
A szám tárolása és az ábrázolása két külön dolog.
0b1101 egy binárisan ábrázolt szám. A decimális jelentése 13
1*8 + 1 * 4 + 0 * 2 + 1 * 1 = 13
& a bináris és. Azaz két szám binárisan ábrázolsz, akkor és össze éseled, akkor azokon a helyeken lesz 1 az értéke, ahol mindkettőnek 1 az értéke, minden más helyen 0 lesz. Ezt minden helyiértéken elvégzed.
Igazságtáblája:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
0b101 & 0b111 = 0b101
0b101 & 0b100 = 0b100
| a bináris vagy. Azaz két szám binárisan ábrázolsz, és össze vagyolod, akkor azokon a helyeken lesz 1 az értéke, ahol valamelyiknek 1 az értéke, ahol mindkettőnek 0 az értéke, ott 0 lesz.
Igazságtáblája: Ezt minden helyiértéken elvégzed.
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
0b101 | 0b111 = 0b111
0b101 | 0b100 = 0b101
^ a bináris xor, avagy kizáróvagy. Azaz két szám binárisan ábrázolsz, és össze xorolod, akkor azokon a helyeken lesz 1 az értéke, ahol a két érték különböző. Ahol a két érték azonos, ott 0 lesz. Ezt minden helyiértéken elvégzed.
Igazságtáblája:
1 | 1 = 0
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
0b101 ^ 0b111 = 0b010
0b101 ^ 0b100 = 0b001
~ bináris negálás. Azaz a bináris negatívját fogja használni. Ezt hívják komplementernek és komplemensnek is. Mivel ezzel végzett műveleteknek van igazán értelme és nem önmagában használjuk, ezért nagyon egyszerűen: Ahol 0 van, ott 1 lesz, ahol 1 van ott 0 lesz.
De ez nem ilyen egyszerű! Mert attól függ, hogy milyen biten ábrázolod a számot
8 biten: ~1 = ~0000 0001 = 1111 1110
Azaz minden biten megfordítja az adott helyéértéken álló bit értékét.
Ez nem azonos a negálással, ez a 2es komplemense a bináris számnak.
Ha érdekel, olvass utána.
a << n balra tolás n bittel
a >> n jobbra tolás n bittel
Ezt úgy képzeld el, hogy ábrázolod a számot és a meglévő bitjeit odébb tolod. C-ben ebből lehet szép bajokat csinálni, ha nincs levédve a változó határa. Python ennél jobban kényesztet és egyszerű változóknál nem fogsz csinálni sem túlcímzést. Sem más bajt, ami a bitműveletekkel elérhető. Mivel python lekezeli ezt neked a tovább csúsztatott bitek nem jelennek meg máshol jobbra tolásnál és nem is keletkezne máshonnan balra tolásnál.
Példa 8 biten:
139 >> 2 = 0x8B >> 2 # csakhogy borzoljam a kedélyeket a hozzá nem értő válaszadók között. Teljesen mindegy, milyen ábrázolást használsz, a tárolása a számnak akkor is binárisban fog történni. Ezért akár decimálisan, akár hexában is ábrázolhatod a számot.
1000 1011 >> 2 = 0010 0010 = 34
139 << 2 = 0213 << 2 # csakhogy borzoljam a kedélyeket a hozzá nem értő válaszadók között. Teljesen mindegy, milyen ábrázolást használsz, a tárolása a számnak akkor is binárisban fog történni. Ezért akár decimálisan, akár oktálisan is ábrázolhatod a számot.
1000 1011 << 2 = 0100 1100 = 76
Ha nem csak 8 biten lenne ábrázolva, akkor az elejéről a bit is tovább vándorolna.
Nagyon jól működik ez bit flag rendszereknél. Gyors és egyszerre több flag ábrázolható egy számon, ami nagyon hasznos adatbázisok esetén.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
A többiek linkjei is pont ezt írták le. Az picit profibb.
Csak lusta voltam kikeresni, ezért kétszer fáradtam.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!