Logisk förändring

Logiska skiftoperatörer i olika programmeringsspråk och processorer
Språk eller processor Vänster Höger
Ada Skift_Vänster Skift_Höger

Batch , C , C++ , Go , Swift (endast osignerade typer); Standard ML , Verilog , PHP , Python , Rust (endast osignerade typer)
< >>
D , Java , JavaScript , Julia < >>>
F# (endast osignerade typer) << >>>
Fortran LSHIFT RSHIFT
Ocaml lsl lsr
Object Pascal , Delphi , x86 assembly , Kotlin , Powershell shl shr
VHSIC Hardware Description Language ( VHDL ), MIPS sll srl
PowerPC slw srw

Inom datavetenskap är ett logiskt skifte en bitvis operation som skiftar alla bitar i sin operand. De två basvarianterna är det logiska vänsterskiftet och det logiska högerskiftet . Detta moduleras ytterligare av antalet bitpositioner ett givet värde ska förskjutas, såsom skift vänster med 1 eller skift åt höger med n . Till skillnad från ett aritmetiskt skift bevarar ett logiskt skift inte ett tals teckenbit eller skiljer ett tals exponent från dess signifikand (mantissa); varje bit i operanden flyttas helt enkelt ett givet antal bitpositioner, och de lediga bitpositionerna fylls, vanligtvis med nollor, och möjligen ettor (kontras med ett cirkulärt skift ).

Ett logiskt skift används ofta när dess operand behandlas som en sekvens av bitar istället för som ett tal.

Logiska skift kan vara användbara som effektiva sätt att utföra multiplikation eller division av heltal utan tecken med två potenser. Att flytta vänster med n bitar på ett binärt tal med eller utan tecken har effekten att det multipliceras med 2 n . Att skifta åt höger med n bitar på ett binärt tal utan tecken har effekten att det divideras med 2 n (avrundning mot 0).

Logisk högerförskjutning skiljer sig från aritmetisk högerförskjutning. Således har många språk olika operatörer för dem. Till exempel i Java och JavaScript är den logiska högerskiftoperatorn >>> , men den aritmetiska högerskiftoperatorn är >> . (Java har bara en vänsterskiftsoperatör ( << ), eftersom vänsterväxling via logik och aritmetik har samma effekt.)

Programmeringsspråken C , C++ och Go har dock bara en högerskiftoperator , >> . De flesta C- och C++-implementeringar, och Go, väljer vilken högerförskjutning som ska utföras beroende på vilken typ av heltal som förskjuts: heltal med tecken skiftas med det aritmetiska skiftet, och heltal utan tecken skiftas med det logiska skiftet.

Alla för närvarande relevanta C-standarder (ISO/IEC 9899:1999 till 2011) lämnar ett definitionsgap för fall där antalet skift är lika med eller större än antalet bitar i operanderna på ett sätt att resultatet är odefinierat. Detta hjälper till att tillåta C-kompilatorer att avge effektiv kod för olika plattformar genom att tillåta direkt användning av de ursprungliga skiftinstruktionerna som har olika beteende. Till exempel väljer skift-vänster-ord i PowerPC det mer intuitiva beteendet där skiftning med bitbredden eller högre ger noll, medan SHL i x86 väljer att maskera skiftbeloppet till de lägre bitarna för att minska den maximala exekveringstiden för instruktionerna , och som sådan ändrar inte en förändring av bitbredden värdet.

Vissa språk, som .NET Framework och LLVM , lämnar också skiftning med bitbredden och över ospecificerad (.NET) eller odefinierad (LLVM). Andra väljer att specificera beteendet för sina vanligaste målplattformar, till exempel C# som specificerar x86-beteendet.

Exempel

Om bitsekvensen 0001 0111 (decimal 23) logiskt förskjuts med en bitposition, då:

Skift vänster ger: 0010 1110 (decimal 46)
Logisk vänsterväxling en bit
Skift höger ger: 0000 1011 (decimal 11)
Logisk högerväxling en bit

Notera: MSB = Mest signifikant bit, LSB = Minst signifikanta bit