Aritmetik kayma - Arithmetic shift

Bir ikili sayının 1 ile sağa aritmetik kayması En anlamlı bitteki boş konum, orijinal MSB'nin bir kopyası ile doldurulur.
Bir ikili sayının 1 ile sola aritmetik kayması. En az anlamlı bitteki boş konum bir sıfır ile doldurulur.
Çeşitli programlama dillerinde ve işlemcilerde aritmetik kaydırma operatörleri
Dil veya işlemci Ayrıldı Doğru
ActionScript 3, Java , JavaScript , Python , PHP , Ruby ;
C , C++ , D , C# , Go , Julia , Swift (yalnızca işaretli türler)
<< >>
Ada Shift_Left Shift_Right_Arithmetic
Kotlin shl shr
standart makine öğrenimi << ~>>
verilog <<< >>>
OpenVMS makro dili @
Şema arithmetic-shift
Ortak Lisp ash
OCaml lsl asr
Haskell Data.Bits.shift
Montaj, 68k ASL ASR
Montaj, x86 SAL SAR
VHDL sla sra
RISC-V sll, slli sra, srai
Z80 SLA SRA

Gelen bilgisayar programlama , bir aritmetik kaydırma bir olan vardiya operatör bazen adlandırılan, imzalı vardiya (imzalı operandların ile sınırlı değildir rağmen). İki temel tür, aritmetik sola kaydırma ve aritmetik sağa kaydırmadır . İçin ikili sayı bir olduğunu bit düzeyinde işlem olduğunu bütün işlenen bit kaymalar; İşlenendeki her bit, belirli sayıda bit konumu basitçe taşınır ve boş bit konumları doldurulur. Mantıksal kaydırmada olduğu gibi tüm 0'larla doldurulmak yerine , sağa kaydırılırken en soldaki bit (genellikle işaretli tamsayı gösterimlerinde işaret biti ), tüm boş pozisyonları doldurmak için çoğaltılır (bu bir tür işaret uzantısıdır ).

Bazı yazarlar, sırasıyla aritmetik ve mantıksal kaymalar için yapışkan sağa kaydırma ve sıfır doldurma sağa kaydırma terimlerini tercih ederler .

Aritmetik kaymalar, işaretli tam sayıların ikinin kuvvetleriyle çarpılması veya bölünmesini gerçekleştirmenin 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 . İkiye tümleyen işaretli ikili sayı üzerinde n bit sağa kaydırma, onu 2 n'ye bölme etkisine sahiptir , ancak her zaman aşağı yuvarlar (negatif sonsuza doğru). Bu, yuvarlamanın genellikle işaretli tamsayı bölümünde (0'a doğru yuvarlanan) yapılma biçiminden farklıdır. Bu tutarsızlık, bir dizi derleyicide hatalara yol açmıştır.

Örneğin, x86 komut setinde , SAR komutu (aritmetik sağa kaydırma) işaretli bir sayıyı eksi sonsuza doğru yuvarlayarak ikinin üssüne böler. Ancak, IDIV talimatı (işaretli bölme) işaretli bir sayıyı sıfıra yuvarlayarak böler. Bu nedenle, bir SAR talimatı, iki talimatın gücü ile bir IDIV için ikame edilemez veya bunun tersi de mümkün değildir.

Resmi tanımlama

Federal Standart 1037C'den aritmetik kaymanın resmi tanımı şudur:

Sabit bir sayı tabanı numaralandırma sisteminde ve sabit noktalı bir temsil sisteminde bir sayının temsiline uygulanan ve yalnızca sayının sabit noktalı kısmını temsil eden karakterlerin hareket ettirildiği bir kaydırma . Aritmetik bir kaydırma, herhangi bir yuvarlama etkisi dışında, genellikle sayı tabanının pozitif veya negatif bir integral gücüyle çarpmaya eşdeğerdir; özellikle kayan nokta gösterimi durumunda mantıksal kaymayı aritmetik kayma ile karşılaştırın .

FS 1073C tanımındaki önemli bir kelime "genellikle"dir.

Aritmetik ve mantıksal sola kaydırma ve çarpmanın denkliği

Aritmetik sola kaydırmalar, tabanın (pozitif, integral) kuvvetiyle çarpmaya eşdeğerdir (örneğin, ikili sayılar için 2'nin kuvvetiyle çarpma). Mantıksal sola kaydırmalar da eşdeğerdir, ancak çarpma ve aritmetik kaydırmalar aritmetik taşmayı tetikleyebilirken mantıksal kaydırmalar tetiklemez .

Aritmetik sağa kaydırma ve bölmenin denk olmaması

Bununla birlikte, aritmetik sağa kaymalar, özellikle negatif tamsayıların yuvarlanmasını ele alırken, dikkatsizler için büyük tuzaklardır. Örneğin, negatif tamsayıların olağan ikiye tümleyen temsilinde, -1, tüm 1'ler olarak temsil edilir. 8 bitlik işaretli bir tamsayı için bu 1111 1111'dir. 1 (veya 2, 3, ..., 7) aritmetik sağa kaydırma, yine 1111 1111 verir, bu da hala -1'dir. Bu, aşağı yuvarlamaya (negatif sonsuza doğru) karşılık gelir, ancak bölme için olağan bir kural değildir.

Aritmetik sağa kaydırmaların, tabanın (pozitif, integral) bir kuvvetiyle bölmeye eşdeğer olduğu (örneğin, ikili sayılar için 2'nin kuvvetiyle bir bölme) ve dolayısıyla tabanın bir kuvvetiyle bölmenin eşit olduğu sıklıkla belirtilir. aritmetik bir sağa kaydırma olarak uygulanarak optimize edilmiştir. (Bir kaydırıcı, bölücüden çok daha basittir. Çoğu işlemcide, kaydırma yönergeleri bölme yönergelerinden daha hızlı yürütülür.) DEC , IBM , Data General gibi şirketlerden ve kurumlardan çok sayıda 1960'lar ve 1970'ler programlama el kitapları, kılavuzlar ve diğer özellikler ve ANSI bu tür yanlış beyanlarda bulunur.

Mantıksal sağa kaymalar, yalnızca pozitif veya işaretsiz sayılar için sayı tabanının (genellikle 2) bir kuvvetiyle bölmeye eşdeğerdir. Aritmetik sağa kaydırmalar, pozitif işaretli sayılar için mantıksal sağa kaydırmalara eşdeğerdir. N-1'in tümleyenindeki (genellikle ikinin tümleyeni ) negatif sayılar için aritmetik sağa kaymalar , tek sayılar için aşağı yuvarlamanın uygulandığı (genellikle beklendiği gibi 0'a doğru değil) bir tabanın (genellikle 2) kuvvetiyle bölmeye kabaca eşdeğerdir.

Negatif sayılar için aritmetik sağa kaymalar, bazı tarihi bilgisayarlar tarafından kullanılan imzalı sayıların tümleyen temsilinde 0'a doğru yuvarlamayı kullanan bölmeye eşdeğerdir , ancak bu artık genel kullanımda değildir.

Sorunun programlama dillerinde ele alınması

C programlama dili için (1999) ISO standardı , sağa kaydırma operatörünü 2'nin kuvvetlerine göre bölmeler açısından tanımlar. negatif değerler. Bu gibi durumlarda sağa kaydırma operatörünün davranışını belirtmez, bunun yerine her bir C derleyicisinin negatif değerleri sağa kaydırma davranışını tanımlamasını gerektirir.

Uygulamalar

Tutarlı aşağı yuvarlamanın istendiği uygulamalarda, işaretli değerler için aritmetik sağa kaydırma yararlıdır. Bir örnek, eşit aralığı koruyan iki güçle raster koordinatlarını küçültmedir . Örneğin, 1 ile sağa kaydırma 0, 1, 2, 3, 4, 5, ... ile 0, 0, 1, 1, 2, 2, ..., ve -1, -2, -3 gönderir, −4, ... ila −1, −1, −2, −2, ..., eşit aralığı −2, −2, −1, −1, 0, 0, 1, 1, 2, 2 olarak koruyarak , ... Tersine, sıfıra yuvarlama ile tamsayı bölme, −1, 0 ve 1'in tümünü 0'a gönderir (2 yerine 3 puan), −2, −1, −1, 0, 0, 0, 1, 1, 2, 2, ... bunun yerine 0'da düzensizdir.

Notlar

  1. ^ C ve C ++ operatör mutlaka bir aritmetik kaydırma değildir. Sol tarafında işaretli bir tamsayı türü ile kullanıldığında, genellikle yalnızca aritmetik bir kaydırmadır. Bunun yerine işaretsiz bir tamsayı türünde kullanılırsa, mantıksal bir kayma olacaktır. >>
  2. ^ Verilog aritmetik sağa kaydırma operatörü, yalnızca ilk işlenen işaretliyse aritmetik bir kaydırma gerçekleştirir. İlk işlenen işaretsizse, operatör aslında mantıksal bir sağa kaydırma gerçekleştirir.
  3. ^ İn OpenVMS makro dili, bir aritmetik kaydırma ikinci işlenen pozitif veya negatif olup olmadığı belirlenir sağa sola veya olup olmadığını gösterir. Bu olağandışı. Çoğu programlama dilinde, iki yönün farklı operatörleri vardır, operatör yönü belirtir ve ikinci işlenen dolaylı olarak pozitiftir. (Verilog gibi bazı diller, negatif değerlerin işaretsiz pozitif değerlere dönüştürülmesini gerektirir. C ve C++ gibi bazı dillerde, negatif değerler kullanılıyorsa tanımlanmış davranış yoktur.)
  4. ^ Şemaarithmetic-shiftR6RS Şeması hem ekler rağmen, OpenVMS makro dili çok benzer ikinci işlenen, bağlı hem sağ hem sol vardiya olabilir-rightve-leftvaryantları.
  5. ^ Haskell'ın gelen sınıfmodülü hem tanımlayanimzalı argüman alıp/imzasız argümanlar alarak. Bunlar izomorfiktir ; yeni tanımlar için programcının iki formdan sadece birini sağlaması gerekir ve diğer form sağlanan form açısından otomatik olarak tanımlanacaktır.BitsData.BitsshiftshiftLshiftR
  6. ^ VHDL aritmetik sola kaydırma operatörü olağandışıdır. Sonucun LSB'sini sıfır ile doldurmak yerine orijinal LSB'yi yeni LSB'ye kopyalar. Bu, aritmetik sağa kaymanın tam bir ayna görüntüsü olsa da, operatörün geleneksel tanımı değildir ve 2'nin kuvvetiyle çarpmaya eşdeğer değildir. VHDL 2008 standardında bu garip davranış değişmeden bırakılmıştır (geriye dönük uyumluluk için). ) zorunlu sayısal yorumlamaya sahip olmayan (örneğin, BIT_VECTOR)bağımsız değişken türleriiçin, ancak imzasız ve imzalı bağımsız değişken türleriiçin 'SLA'beklenen şekilde davranır (yani, en sağdaki konumlar sıfırlarla doldurulur). VHDL'nin mantıksal sola kaydırma (SLL) işlevi, yukarıda bahsedilen 'standart' aritmetik kaydırmayı uygular.
  7. ^ C standardının amacı, C dilini herhangi birinin tamamlayıcısı veya ikinin tamamlayıcısı mimarileriyle sınırlamamaktı. Bu gibi, birlerin tamamlayıcısı ve ikinin tamamlayıcı temsillerinin davranışlarının farklı olduğu durumlarda, standart, bireysel C derleyicilerinin hedef mimarilerinin davranışını belgelemesini gerektirir. Belgelerine GNU derleyicisi (GCC), örneğin, işaret-uzantısına kullanılarak olarak davranışı açıklanmaktadır.

Referanslar

Çapraz referans

Kullanılan kaynaklar

Kamu malı Bu makale , Genel Hizmetler İdaresi belgesindeki kamuya açık materyalleri içermektedir  : "Federal Standart 1037C" .