2017-10-13 54 views
5

Kesintisiz dokular oluşturmak için etrafa sarılı C# içinde elmas kare algoritmasının bir implementation hakkında okudum. Bir sonraki noktayı hesaplamak için, bir karede veya bir pırlantada düzenlenmiş dört örnek noktasının ortalaması alınır. Bir örnek nokta, dokunun kenarından yatarsa, diğer tarafa sarılır. Bu sarma aşağıdaki yöntem kullanılarak yapılacak görünür: AraştırmanınBu ifadede bitsel işlev nedir?

public double sample(int x, int y) 
{ 
    return values[(x & (width - 1)) + (y & (height - 1)) * width]; 
} 

Biraz bu bit tabanlı operatör olduğunu söylüyor. Daha önce onları kullanmadım ve wikipedia article aydınlatıcı değildi. Birisi bu yöntemde & operatörünün ne yaptığını açıklayabilir mi?

DÜZENLEME: doku boyutları It "sarma" için var her zaman iki

cevap

8

yetkileri şunlardır. (Bu daha iyi gerçek olamayacak vardı bu yüzden aksi takdirde çalışmaz,) width ve height varsayarsak ikisinin güçleri de olumsuz olurdu negatif x ile x % width oysa (negatif x için çalışıyor olması dışında, x & (width - 1), x % width çoğunlukla eşdeğerdir vardır Sonuç) ve neredeyse kesinlikle daha hızlı.

Veya bir örnekle görsel koymak için, size w-1 şeklinde görebileceğiniz gibi daha sonra

x  = 00000000 00000000 00000000 01001100 
w  = 00000000 00000000 00000000 01000000 
w-1  = 00000000 00000000 00000000 00111111 
x & w-1 = 00000000 00000000 00000000 00001100 = 12 

, width = 64 ve x = 64+12 = 76 demek, operasyon x & w-1 varsayarak x sadece alt bitlerini almak gibi Tabii ki w hala ikisinin bir gücü. Böylece 64 ve 64'ün katları olan bitler kaldırılır, tıpkı gerçek bir "modulo 64" işlemi gibi (imzalı tamsayılarla çalışıyorsanız C# 'de % değil, geri kalan).