Logikai és bitszintű operátorok

Logikai operátorok segítségével (-and , -or , -xor ) össze tudunk fűzni több logikai kifejezést, és a szokásos „igazság táblák” alapján kapjuk meg az összetett kifejezésünk igaz vagy hamis értékét:

[24] PS I:\>$false -eq $false -and $true -eq $true

True

[25] PS I:\>"ablak" -ne "ajtó" -or 5 -eq 6

True

[26] PS I:\>1 -eq 1 -xor 2 -gt 1

False

[27] PS I:\>-not $true

False

[28] PS C:\> !$true

False

A [28]-ban látható, hogy az egytagú –not  operátor negálja az eredményt. A –not helyett használhatjuk a !  (felkiáltójel) jelölést is.

Kényelmi szolgáltatásként nem kell $true  vagy $false -ra redukálni a logikai operátorok operandusait, a triviális leképezéseket elvégzi helyettünk a PowerShell. Általában minden 0-tól, $null -tól, vagy üres kifejezéstől eltérő értékeket $true-nak kezel:

[29] PS I:\>7 -and $true

True

[30] PS I:\>"valami" -and $true

True

[31] PS I:\>$null -and $true

False

[32] PS I:\>"" -and $true

False

[33] PS I:\>0 -and $true

False

Megjegyzés

Az –and, -or használatakor vigyázni kell, mert nem értékelődik ki a jobboldaluk, ha már a baloldal alapján el tudja dönteni a végeredményt:

[35] PS I:\>$false -and ($a=25)

False

[36] PS I:\>$a

[37] PS I:\>($a=25) -and $false

False

[38] PS I:\>$a

25

[39] PS I:\>$true -or ($b="valami")

True

[40] PS I:\>$b

[41] PS I:\>($b="valami") -or $true

True

[42] PS I:\>$b

valami

Tehát nem érdemes egyéb műveleteket végeztetni a logikai operátorok operandusaiban, mert ha nem kellő figyelemmel választjuk ki az oldalakat, akkor esetleg nem úgy működik a programunk, ahogy vártuk.

A fenti logikai operátorok tehát vagy $false, vagy $true értéket adnak vissza. Ha „igazi” bit szintű logikai műveleteket akarunk elvégezni, akkor ehhez külön logikai operátorok vannak: ‑band , -bor , -bxor , -bnot :

[44] PS I:\>126 -bor 1

127

[45] PS I:\>(128+8+4+1) -bor 132

141

[46] PS I:\>(128+8+4+1) -band (128+16+8)

136

[47] PS I:\>(128+8+4+1) -bxor (128+16+8)

21

[48] PS I:\>-bnot 255

-256

[49] PS I:\>-bnot 1

-2

Itt természetesen mindig kiértékelődik a művelet mindkét oldala.

A PowerShell 3.0-ban jelent meg a bitek eltolásának lehetősége a –shl  és a –shr  operátorokkal. Nem mintha nagy igényem lett volna erre a funkcióra az elmúlt 7 évben, de elképzelhető, hogy valakinek ez jól jön. Nézzünk erre pár példát! Ugye itt mindent a 2-es számrendszerben érdemes elképzelni, ekkor, ha a 8-as helyiértéken levő bitet balra tolom, akkor 16 lesz az eredmény:

PS C:\> 8 -shl 1

16

Ugyanezt jobbra tolva 4 lesz:

PS C:\> 8 -shr 1

4

Természetesen több helyiértékkel is tologathatom a biteket. Ha egy 32 biten ábrázolt számot pont 32 hellyel toljuk balra, akkor valójában nem csinálunk semmit:

PS C:\> 1 -shl 32

1

Azaz, ha a jobb oldali szám nagyobb, mint 31, akkor a 32 osztás maradékával lesz eltolva a bal oldali szám. Ugyanezt 64 bites számoknál 64-es tolásra érjük el:

PS C:\> [long] 1 -shl 32

4294967296

PS C:\> [long] 1 -shl 64

1

Ha elég nagy számot tolunk el balra, akkor belecsúszhatunk az előjel bitbe, ami a számot negatívvá teszi:

PS C:\> 1 -shl 30

1073741824

PS C:\> 1073741824 -shl 1

-2147483648

Jobbra tolásnál a kifutó bitek elvesznek, így ha elég sokat tolunk jobbra akkor előbb-utóbb 0-át kapunk.

PS C:\> 1024 -shr 18

0



Word To HTML Converter