Desplaçament lògic
En informàtica, un desplaçament lògic és una operació per bits que desplaça tots els bits del seu operand. Les dues variants base són el desplaçament lògic a l'esquerra i el desplaçament lògic a la dreta. Això es modula encara més pel nombre de posicions de bits que s'ha de desplaçar un valor donat, com ara el desplaçament a l'esquerra en 1 o el desplaçament a la dreta en n. A diferència d'un desplaçament aritmètic, un desplaçament lògic no conserva el bit de signe d'un nombre ni distingeix l'exponent d'un nombre del seu significat (mantissa); cada bit de l'operand es mou simplement un nombre donat de posicions de bits, i les posicions de bits vacants s'omplen, generalment amb zeros, i possiblement amb uns (contrast amb un desplaçament circular).[1]
Sovint s'utilitza un desplaçament lògic quan el seu operand es tracta com una seqüència de bits en lloc de com un nombre.
Operadors de desplaçament lògic en diversos llenguatges de programació i processadors:
Llenguatge o processador | Esquerra | Dret |
---|---|---|
Ada | Shift_Left | Shift_Right |
Batch,[2] C, C++, Go, Swift (només tipus sense signar);
Standard ML, Verilog, PHP, Python,[3] Rust [4] (només tipus sense signar [5]) |
<< | >> |
D, Java, JavaScript, Julia | << | >>> |
F# (només tipus sense signar) | <<< | >>> |
Fortran | LSHIFT | RSHIFT |
OCaml | lsl | lsr |
Objecte Pascal, Delphi, x86 assembly, Kotlin, Powershell | shl | shr |
Llenguatge de descripció de maquinari VHSIC (VHDL), MIPS | sll | srl |
PowerPC | slw | srw |
Els desplaçaments lògics poden ser útils com a maneres eficients de realitzar la multiplicació o la divisió de nombres enters sense signe per potències de dos. El desplaçament cap a l'esquerra de n bits en un nombre binari amb signe o sense signe té l'efecte de multiplicar-lo per 2n. El desplaçament cap a la dreta de n bits en un nombre binari sense signe té l'efecte de dividir-lo per 2n (arrodoniment cap a 0).
El desplaçament lògic a la dreta és diferent del desplaçament aritmètic a la dreta. Així, molts idiomes tenen operadors diferents per a ells. Per exemple, a Java i JavaScript, l'operador lògic de desplaçament a la dreta és >>>, però l'operador aritmètic de desplaçament a la dreta és >>. (Java només té un operador de desplaçament esquerre (<<), perquè el desplaçament a l'esquerra mitjançant la lògica i l'aritmètica tenen el mateix efecte.)
Exemple
[modifica]Si la seqüència de bits 0001 0111 (decimal 23) es desplaça lògicament en una posició de bit, aleshores:
El canvi cap a l'esquerra produeix: 0010 1110 (decimal 46) | El canvi cap a la dreta produeix: 0000 1011 (decimal 11) |
Nota: MSB = Bit més significatiu, LSB = Bit menys significatiu
Referències
[modifica]- ↑ «[https://cscie93.dce.harvard.edu/spring2023/slides/Logical%20and%20Arithmetic%20Shifting.pdf Logical and Arithmetic Shifting]» (en anglès). [Consulta: 7 desembre 2023].
- ↑ https://ss64.com/nt/set.html
- ↑ «BitwiseOperators - Python Wiki» (en anglès). wiki.python.org. [Consulta: 24 gener 2018].
- ↑ «Shl in std::ops - Rust» (en anglès). doc.rust-lang.org. [Consulta: 17 gener 2022].
- ↑ «Operator Expressions: Arithmetic and Logical Binary Operators» (en anglès). doc.rust-lang.org. [Consulta: 13 novembre 2022].