XOR takas algoritması - XOR swap algorithm

Üç XOR işlemi ile 1010 ve 0011 ikili değerleri değişkenler arasında değiştirilir.
Takas için XOR takas algoritmasını kullanma kemirmeler geçici depolama kullanmadan değişkenler arasında

İçinde bilgisayar Programlama, XOR takas bir algoritma kullanan ÖZELVEYA bitsel işlem -e takas farklı değerler değişkenler aynısına sahip olmak veri tipi geçici bir değişken kullanmadan. "Farklı", algoritma tek bir takma değeri sıfıra ayarlayacağı için değişkenlerin farklı, çakışmayan bellek adreslerinde depolandığı anlamına gelir; değişkenlerin gerçek değerlerinin farklı olması gerekmez.

Algoritma

Geleneksel değiştirme, geçici bir depolama değişkeninin kullanılmasını gerektirir. Bununla birlikte, XOR takas algoritmasını kullanarak geçici depolamaya gerek yoktur. Algoritma aşağıdaki gibidir:[1][2]

X := X ÖZELVEYA YY := Y ÖZELVEYA XX := X ÖZELVEYA Y

Algoritma tipik olarak üçe karşılık gelir makine kodu Talimatlar. XOR bir değişmeli işlem, X XOR Y herhangi bir satırda Y XOR X ile değiştirilebilir. Assembly dilinde kodlandığında, bu değişebilirlik genellikle ikinci satırda uygulanır:

Sözde kodIBM Sistem / 370 montajx86 montajı
X := X ÖZELVEYA YXR R1,R2Xor eax, ebx
Y := Y ÖZELVEYA XXR R2,R1Xor ebx, eax
X := X ÖZELVEYA YXR R1,R2Xor eax, ebx

Yukarıdaki System / 370 montaj kodu örneğinde, R1 ve R2 farklıdır kayıtlar, ve her biri XR işlem, sonucunu ilk bağımsız değişkendeki kayıt defterinde bırakır. X86 derlemesini kullanarak, X ve Y değerleri eax ve ebx yazmaçlarında (sırasıyla) ve Xor işlemin sonucunu ilk kayda yerleştirir.

Ancak, algoritma başarısız olur x ve y o konumda saklanan değer ilk XOR komutu ile sıfırlanacağından ve sonra sıfır kalacağından aynı depolama konumunu kullanın; "kendisiyle değiştirilmeyecek". Bu değil sanki aynı x ve y aynı değerlere sahip. Sorun sadece ne zaman gelir x ve y aynı saklama yerini kullanın, bu durumda değerleri zaten eşit olmalıdır. Yani, eğer x ve y aynı saklama konumunu, ardından satırı kullanın:

X := X ÖZELVEYA Y

setleri x sıfıra (çünkü x = y yani X XOR Y sıfırdır) ve setleri y sıfıra (aynı depolama konumunu kullandığı için), x ve y orijinal değerlerini kaybetmek.

Doğruluğun kanıtı

ikili işlem XOR, uzunluktaki bit dizileri üzerinde aşağıdaki özellikleri sergiler (nerede XOR anlamına gelir):[a]

  • L1. Değişebilirlik:
  • L2. İlişkisellik:
  • L3. Kimlik var: bir bit dizesi var, 0, (uzunlukta N) öyle ki herhangi
  • L4. Her eleman kendi ters: her biri için , .

Diyelim ki iki farklı kaydımız var R1 ve R2 aşağıdaki tablodaki gibi, başlangıç ​​değerleriyle Bir ve B sırasıyla. Aşağıdaki işlemleri sırasıyla gerçekleştiriyor ve yukarıda listelenen özellikleri kullanarak sonuçlarımızı düşürüyoruz.

AdımOperasyonKayıt 1Kayıt 2İndirgeme
0Başlangıç ​​değeri
1R1: = R1 XOR R2
2R2: = R1 XOR R2

L2
L4
L3
3R1: = R1 XOR R2


L1
L2
L4
L3

Doğrusal cebir yorumu

XOR ikili toplama olarak yorumlanabildiğinden ve bir çift bit iki boyutlu bir vektör olarak yorumlanabilir. vektör alanı üzerinde iki unsurlu alan Algoritmadaki adımlar, iki elemanlı alan üzerinde 2 × 2 matrislerle çarpma olarak yorumlanabilir. Basit olması için, başlangıçta şunu varsayalım: x ve y bit vektörleri değil, her biri tek bittir.

Örneğin, adım:

X := X ÖZELVEYA Y

aynı zamanda örtük olan:

Y := Y

matrise karşılık gelir gibi

İşlem sırası şu şekilde ifade edilir:

(ikili değerlerle çalışmak, yani ), ifade eden temel matris iki satırı (veya sütunu), geçişler (makaslama) bir elementi diğerine ekleme.

X ve Y'nin tek bit olmadığı, bunun yerine uzunluktaki bit vektörleri olduğu genellemek için n, bu 2 × 2 matrisler 2 ile değiştirilirn×2n blok matrisler gibi

Bu matrisler üzerinde çalışıyor değerler, değil değişkenler (depolama yerleri ile), dolayısıyla bu yorum, depolama konumu sorunlarından ve aynı depolama konumunu paylaşan her iki değişkenin sorunundan soyutlanır.

Kod örneği

Bir C XOR takas algoritmasını uygulayan işlev:

geçersiz XorSwap(int *x, int *y) {  Eğer (x != y)  {    *x ^= *y;    *y ^= *x;    *x ^= *y;  }}

Kod ilk önce adreslerin farklı olup olmadığını kontrol eder. Aksi takdirde, eğer eşit olsalardı, algoritma üçlü * x ^ = * x'e katlanır ve sonuç sıfır olur.

XOR takas algoritması ayrıca bir makro ile tanımlanabilir:

#define XORSWAP_UNSAFE (a, b)   ((bir) ^ = (b), (b) ^ = (bir),    (a) ^ = (b)) / * A ve b aynı nesne olduğunda çalışmaz - sıfır atar                   (0) bu durumda nesneye * /#define XORSWAP (a, b)   ((& (a) == & (b))? (a) / * Farklı adresleri kontrol edin * /                    \                  : XORSWAP_UNSAFE (a, b))

Pratikte kullanım nedenleri

Çoğu pratik senaryoda, geçici bir kayıt kullanan önemsiz takas algoritması daha verimlidir. XOR takasının pratik olabileceği sınırlı durumlar şunları içerir:

  • komut kümesi kodlamasının XOR takasının daha az sayıda baytta kodlanmasına izin verdiği bir işlemcide
  • yüksek olan bir bölgede kayıt basıncı izin verebilir ayırıcı kaydet kaçınmak bir sicil dökmek
  • içinde mikrodenetleyiciler kullanılabilir RAM çok sınırlıdır.
  • zamana dayalı yan kanal saldırılarını önlemek için sabit zaman işlevlerine ihtiyaç duyan kriptografik uygulamalarda[3]

Bu durumlar nadir olduğu için, çoğu iyileştirici derleyici XOR takas kodu oluşturmaz.

Uygulamada kaçınma nedenleri

Çoğu modern derleyici, üç yollu takastaki geçici değişkeni optimize edebilir; bu durumda, XOR takas ile aynı miktarda bellek ve aynı sayıda kayıt kullanır ve en azından aynı hızda ve genellikle daha hızlıdır. Buna ek olarak, XOR takası, tekniğe aşina olmayan herkes için tamamen opaktır.

Modern üzerine CPU mimarileri XOR tekniği, takas yapmak için geçici bir değişken kullanmaktan daha yavaş olabilir. En azından hem AMD hem de Intel tarafından sunulan yeni x86 CPU'larda, kayıtlar arasında düzenli olarak hareket etmek sıfır gecikmeye neden olur. (Buna MOV eleme denir.) Kullanılabilecek herhangi bir mimari kayıt olmasa bile, XCHG talimat en az birlikte alınan üç XOR kadar hızlı olacaktır. Diğer bir neden, modern CPU'ların talimatları paralel olarak yürütmeye çalışmasıdır. talimat ardışık düzenleri. XOR tekniğinde, her bir işlemin girdileri, önceki işlemin sonuçlarına bağlıdır, bu nedenle, bunların herhangi bir faydasını geçersiz kılarak, kesinlikle ardışık sırada yürütülmeleri gerekir öğretim düzeyinde paralellik.[4]

Aliasing

XOR takası da pratikte karmaşıktır. takma ad. Bazı konumların içeriğini kendisiyle XOR-takas etme girişiminde bulunulursa, sonuç, konumun sıfırlanması ve değerinin kaybolmasıdır. Bu nedenle, örtüşme mümkünse, yüksek seviyeli bir dilde XOR takas körü körüne kullanılmamalıdır.

Benzer sorunlar ortaya çıkar isimle aramak, de olduğu gibi Jensen'in Cihazı nerede takas ben ve A [i] geçici bir değişken aracılığıyla, ilişkili argümanlardan dolayı yanlış sonuçlar verir: temp = i; i = A [i]; A [i] = sıcaklık değerini değiştirir ben ikinci ifadede, daha sonra yanlış i değeri ile sonuçlanır A [i] üçüncü ifadede.

Varyasyonlar

XOR takas algoritmasının temel ilkesi, yukarıdaki L1'den L4'e kadar olan kriterleri karşılayan herhangi bir operasyona uygulanabilir. XOR'u toplama ve çıkarma ile değiştirmek, biraz farklı, ancak büyük ölçüde eşdeğer bir formülasyon sağlar:

geçersiz AddSwap( imzasız int* x, imzasız int* y ){  Eğer (x != y)  {    *x = *x + *y;    *y = *x - *y;    *x = *x - *y;  }}

XOR takasın aksine, bu varyasyon, temeldeki işlemcinin veya programlama dilinin aşağıdaki gibi bir yöntem kullanmasını gerektirir: Modüler aritmetik veya Bignums hesaplamasını garanti etmek için X + Y nedeniyle bir hataya neden olamaz tamsayı taşması. Bu nedenle, pratikte XOR takasından daha nadiren görülür.

Ancak, uygulanması AddSwap Yukarıdaki C programlama dilinde, tamsayı taşması durumunda bile her zaman çalışır, çünkü C standardına göre işaretsiz tamsayıların toplanması ve çıkarılması aşağıdaki kurallara uymaktadır Modüler aritmetik, ben. e. yapılır döngüsel grup nerede bit sayısı imzasız int. Gerçekten de, algoritmanın doğruluğu, formüllerin ve herhangi birini tut değişmeli grup. Bu aslında XOR takas algoritmasının ispatının bir genellemesidir: XOR, değişmeli grupta hem toplama hem de çıkarma işlemidir. (hangisi doğrudan toplam nın-nin s Kopyaları ).

Bu, imzalı int type (için varsayılan int). İşaretli tamsayı taşması, C'de tanımlanmamış bir davranıştır ve bu nedenle modüler aritmetik standart tarafından garanti edilmez (standartlara uygun bir derleyici bu tür kodu optimize edebilir, bu da yanlış sonuçlara yol açar).

Ayrıca bakınız

Notlar

  1. ^ İlk üç özellik, her bir eleman için bir tersinin varlığı ile birlikte, bir değişmeli grup. Son özellik, her öğenin bir evrim yani sahip olmak sipariş 2, tüm değişmeli gruplar için doğru değildir.

Referanslar

  1. ^ "XOR'un Büyüsü". Cs.umd.edu. Alındı 2014-04-02.
  2. ^ "XOR ile Değerleri Değiştirme". graphics.stanford.edu. Alındı 2014-05-02.
  3. ^ Bruce Schneier, Tadayoshi Kohno, Niels Ferguson, (2010). Kriptografi mühendisliği: tasarım ilkeleri ve pratik uygulamalar. Indianapolis, IN: Wiley Pub., İnc. s. 251 ff. ISBN  978-0-470-47424-2.CS1 Maint: ekstra noktalama (bağlantı)
  4. ^ Amarasinghe, Saman; Leiserson, Charles (2010). "6.172 Yazılım Sistemlerinin Performans Mühendisliği, Ders 2". MIT Açık Ders Malzemeleri. Massachusetts Teknoloji Enstitüsü. Alındı 27 Ocak 2015.