Mantıksal kayma - Logical shift

Çeşitli programlama dillerinde ve işlemcilerde mantıksal kaydırma operatörleri
Dil veya işlemci Ayrıldı Sağ
Ada Sola kay Shift_Right
Toplu İş , C , C ++ , Go , Swift (yalnızca imzasız türler);
Standart ML , Verilog , PHP , Python
<< >>
D , Java , JavaScript , Julia << >>>
F # (yalnızca imzasız türler) <<< >>>
Fortran LSHIFT RSHIFT
OCaml lsl lsr
Nesne Pascal , Delphi , x86 derlemesi , Kotlin , Powershell shl shr
VHSIC Donanım Tanımlama Dili ( VHDL ), MIPS sll srl
PowerPC slw srw


Gelen bilgisayar bilimleri , bir mantıksal kaydırma bir olduğunu bit düzeyinde işlem tüm vardiya onun işlenen bit sayısı. İki temel varyant, mantıksal sola kaydırma ve mantıksal sağa kaydırmadır . Bu, belirli bir değerin kaydırılacağı bit konumlarının sayısı ile daha da modüle edilir, örneğin sola 1 kaydırma veya sağa n kaydırma gibi . Bir farklı aritmetik kayması , mantıksal bir kaydırma bir rakamdır işaret bitini korumaz veya bir rakam ayırt üs onun gelen significand (mantis); işlenendeki her bit, belirli sayıda bit konumu ile basitçe hareket ettirilir ve boş bit konumları, genellikle sıfırlarla ve muhtemelen birlerle doldurulur ( dairesel bir kaydırma ile kontrast ).

Mantıksal bir kaydırma, işleneni bir sayı yerine bir bit dizisi olarak ele alındığında sıklıkla kullanılır .

Mantıksal kaymalar, işaretsiz tamsayıların ikiye katlanarak çarpılması veya bölünmesi için etkili yollar olarak yararlı olabilir . İşaretli veya işaretsiz bir ikili sayı üzerinde n bit sola kaydırma, onu 2 n ile çarpma etkisine sahiptir . İşaretsiz bir ikili sayı üzerinde n bit sağa kaydırma , onu 2 n'ye bölme etkisine sahiptir (0'a yuvarlama).

Mantıksal sağa kaydırma, aritmetik sağa kaydırmadan farklıdır. Bu nedenle, birçok dilin onlar için farklı operatörleri vardır. Örneğin, Java ve JavaScript'te mantıksal sağa kaydırma operatörü >>> , aritmetik sağa kaydırma operatörü >> şeklindedir . (Java'nın yalnızca bir sola kaydırma operatörü vardır ( << ), çünkü mantık ve aritmetik yoluyla sola kaydırma aynı etkiye sahiptir.)

Programlama dilleri C , C ++ ve Git Ancak, sadece bir sağa kaydırma operatörü var >> . Çoğu C ve C ++ uygulaması ve Go, kaydırılan tamsayı türüne bağlı olarak hangi sağa kaydırmanın gerçekleştirileceğini seçer: işaretli tamsayılar aritmetik kaydırma kullanılarak kaydırılır ve işaretsiz tam sayılar mantıksal kaydırma kullanılarak kaydırılır.

Halihazırda ilgili tüm C standartları (ISO / IEC 9899: 1999 ila 2011), kayma sayısının, sonucun tanımsız olacağı şekilde işlenenlerdeki bit sayısına eşit veya daha büyük olduğu durumlar için bir tanım boşluğu bırakmaktadır. Bu, C derleyicilerinin, farklı davranışlara sahip yerel kaydırma talimatlarının doğrudan kullanımına izin vererek çeşitli platformlar için verimli kod yaymasına izin verir. Örneğin, kaydırma-sol kelime PowerPC bit genişliği kaydırmayı daha sezgisel bir davranış seçer ya da yukarıda SHL buna karşın, sıfır veren x 86 alt bit kaydırma miktarı maske tercih talimatların maksimum işlem süresini azaltmak için ve bit genişliğindeki böyle bir kayma, değeri değiştirmez.

.NET Framework ve LLVM gibi bazı diller de bit genişliğine göre ve belirtilmemiş (.NET) veya tanımlanmamış (LLVM) üzerinde kayma bırakır . Diğerleri , x86 davranışını belirten C # gibi en yaygın hedef platformlarının davranışını belirlemeyi seçerler .

Misal

0001 0111 (ondalık 23) bit dizisi mantıksal olarak bir bit konumu ile kaydırılırsa, o zaman:

Sola kaydırma verimi: 0010 1110 (ondalık 46)
Mantıksal sola kaydırma bir bit
Sağa kaydırma verimleri: 0000 1011 (ondalık 11)
Mantıksal sağa bir bit kaydırma

Not: MSB = Most Significant Bit, LSB = Least Significant Bit

Referanslar