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
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.
Ezek azok a bitműveletek:
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.
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 © 2024, 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!