Bitsel işlemler, bir sayının bitleri (1'ler ve 0'lar) üzerinde bir eylem gerçekleştirmek için kullanılır.
Bu makalede, "ikili" biçimli bir sayı (bir sayının "bitlerini" temsil eder) 2 ile yazılacaktır. ve 10 olan bir ondalık sayı
SINIRLAMALAR
Sphere'de sayılar "DWORD" adı verilen bir şeyde saklanır. Bir DWORD'un depolayabileceği en büyük sayı, bir DWORD'un 32 bit genişliğinde olması gerçeğiyle sınırlıdır. Bu, saklayabileceği en büyük sayının 2^32-1 olduğu anlamına gelir.
• İkili'de bu 11111111111111111111111111111111.
• Hex'te FFFFFFFF'dir.
• Ondalık olarak bu 4294967295.
Bir DWORD'da 'imzalı' bir sayıyı (başka bir deyişle, pozitif veya negatif olabilen bir sayı) saklamak için, işareti belirtmek için ilk bit kullanılır (1 negatiftir). Bu, en büyük 'işaretli' pozitif sayının 2^31-1 olduğu anlamına gelir
• İkili'de bu 01111111111111111111111111111111.
• Hex'te 7FFFFFFFF'dir.
• Ondalık olarak bu 2147483647'dir.
Sphere komut dosyası dilinde, EVAL işlevi imzalı bir DWORD verir ve UVAL işaretsiz bir DWORD verir.
[FUNCTION Mathtest]
LOCAL.Number0=2147483647
LOCAL.Number1=4294967295
LOCAL.Number2=8589934588
SERV.LOG eval0=<EVAL <LOCAL.Number0>> eval1=<EVAL <LOCAL.Number1>> eval2=<EVAL <LOCAL.Number2>>
SERV.LOG uval0=<UVAL <LOCAL.Number0>> uval1=<UVAL <LOCAL.Number1>> uval2=<UVAL <LOCAL.Number2>>Bu testin çıktısı:13:37:(test.scp,10)eval0=2147483647 eval1=-1 eval2=-4
13:37:(test.scp,11)uval0=2147483647 uval1=4294967295 uval2=4294967292Notlar:• Çıktı, DWORD'un kendisinin sınırlamasıyla hizalanacak şekilde sınırlıdır.
• Bir DWORD'de 32 "bit" olduğundan, bir sette yalnızca 32 flag olabilir.
• EVAL kullanarak flagları manipüle ederken dikkatli olun, çünkü 32. flag kaybolabilir.
FLAGS
Sphere sunucusunda, "flags" kullanılarak epeyce kavram uygulanır. Sphere.ini dosyasında veya sphere_defs.scp dosyalarında tanımlanan flags örneklerini görebilirsiniz. Örneğin:
[DEFNAME attr_flags]
attr_identified 01
attr_decay 02
attr_newbie 04
attr_move_always 08
attr_move_never 010
attr_magic 020
attr_owned 040
attr_invis 080
attr_cursed 0100
attr_cursed2 0200
attr_blessed 0400
attr_blessed2 0800
attr_forsale 01000
attr_stolen 02000
attr_can_decay 04000
attr_static 08000
attr_exceptional 010000
attr_enchanted 020000
attr_imbued 040000
attr_questitem 080000
attr_insured 0100000
attr_nodrop 0200000
attr_notrade 0400000
attr_lockeddown 0800000
attr_secure 01000000 Bu teknik, mümkün olduğunca az bellek kullanarak bir dizi Boole değerini depolamanın çok etkili bir yoludur. Bu listeyi yan tarafına koyalım ve ilk 8 bayrağı çizelim:
Şimdi muhtemelen deseni görebilirsiniz... 1,2,4,8,16,32,64,128 sayıları,... hepsi 2'nin katlarıdır ve özeldirler çünkü ikiliye dönüştürüldüklerinde hepsinin içinde tek bir 1 vardır. Bir nesnedeki tek bir bayrağı etkinleştirmek veya devre dışı bırakmak, AND, OR, XOR ve NOT bit düzeyinde operatörleri kullanılarak gerçekleştirilir.
OR OPERATÖRÜ (OR DAHİL)
Bir bit düzeyinde OR , eşit uzunlukta iki bit deseni alır ve karşılık gelen her bit çifti üzerinde mantıksal kapsayıcı OR işlemini gerçekleştirir. Bu işlemi gerçekleştirdiğinizde, her iki bit de 0 ise her konumdaki sonuç 0'dır ve bitlerden biri (veya her ikisi) 1 ise sonuç 1'dir. Örneğin:
0101 (decimal 5)
OR 0011 (decimal 3)
= 0111 (decimal 7)Sphere'de bu teknik, mevcut flagları korurken bir kayıtta bir flag ayarlamak için yaygın olarak kullanılır. Bu nedenle, 0010 (ondalık 2), birinci, üçüncü ve dördüncü flagların açık (0) ve ikinci bayrağın (1) ayarlandığı dört flagtan oluşan bir set olarak kabul edilebilir. Dördüncü flag, bu değer ile yalnızca dördüncü bit ayarlı bir bit deseni arasında bir bit düzeyinde veya gerçekleştirilerek ayarlanabilir:0010 (decimal 2)
OR 1000 (decimal 8)
= 1010 (decimal 10)Aşağıdaki örnek Sphere kodunda, yeni bir nesne oluşturuyoruz, ardından bu nesne flaglarını 010'a eşit olarak ayarlıyoruz, ardından 4. flagı da etkinleştiriyoruz:SERV.NEW=i_log
ATTR=010
ATTR|=01000Aynı örnek, flag adlarını kullanarak:SERV.NEW=i_log
ATTR=attr_decay
ATTR|=attr_move_always AND OPERATÖRÜ(MANTIK VE):&Bir bit düzeyinde AND, iki eşit uzunlukta ikili gösterim alır ve karşılık gelen bitlerin her bir çifti üzerinde mantıksal VE işlemini çarparak gerçekleştirir. Karşılaştırılan konumdaki her iki bit de 1 ise, elde edilen ikili gösterimdeki bit 1'dir (1 × 1 = 1); Aksi takdirde, sonuç 0 olur (1 × 0 = 0 ve 0 × 0 = 0). Örneğin:
0101 (decimal 5)
AND 0011 (decimal 3)
= 0001 (decimal 1)İşlem, belirli bir bitin ayarlanmış (1) veya net (0) olup olmadığını belirlemek için kullanılabilir. Örneğin, 0011 (ondalık 3) bit deseni verildiğinde, ikinci bitin ayarlanıp ayarlanmadığını belirlemek için yalnızca ikinci bitte 1 içeren bir bit deseni ile bit düzeyinde ve kullanırız:0011 (decimal 3)
AND 0010 (decimal 2)
= 0010 (decimal 2)0010 sonucu sıfır olmadığından, orijinal modeldeki ikinci bitin ayarlandığını biliyoruz. Bu kavram genellikle bit maskeleme olarak adlandırılır. Sphere'da, bu genellikle belirli bir bayrağın etkinleştirilip etkinleştirilmediğini kontrol etmek için bir IF ifadesinde kullanılır. Örneğin, bir nesnenin tanımlanıp tanımlanmadığını kontrol etmek için Sphere kodu, nesnenin ATTR'sinin AND harfini attr_identified bayrağına şu şekilde uygulayarak yapılır:IF (<ATTR>&attr_identified) XOR Operatörü (exclusive OR): Bitsel bir XOR , eşit uzunlukta iki bit deseni alır ve karşılık gelen her bit çifti üzerinde mantıksal özel OR işlemini gerçekleştirir. Yalnızca ilk bit 1 veya yalnızca ikinci bit 1 ise her konumdaki sonuç 1'dir, ancak her ikisi de 0 veya her ikisi de 1 ise 0 olacaktır. Bunda, iki bit farklıysa 1 ve aynıysa 0 olmak üzere iki bitin karşılaştırmasını yapıyoruz. Örneğin:
0101 (decimal 5)
XOR 0011 (decimal 3)
= 0110 (decimal 6)Bitsel XOR genellikle bir kayıtta seçilen bitleri ters çevirmek için kullanılır (aynı zamanda geçiş veya çevirme olarak da adlandırılır). Herhangi bir bit, 1 ile XORing yapılarak değiştirilebilir. Örneğin, 0010 bit deseni (ondalık 2) verildiğinde, ikinci ve dördüncü bitler, ikinci ve dördüncü konumlarda 1 içeren bir bit deseni ile bit düzeyinde bir XOR ile değiştirilebilir:0010 (decimal 2)
XOR 1010 (decimal 10)
= 1000 (decimal 8) NOT Operatörü (Bitwise not): Bitwise NOT veya tümleç, verilen ikili değerin birler tümleyeni oluşturan, her bit üzerinde mantıksal bir olumsuzlama gerçekleştiren bir işlemdir. 0 olan bitler 1 olur ve 1 olan bitler 0 olur. Örneğin:
NOT 0111 (decimal 7)
= 1000 (decimal 8)Bitsel tümleç, eksi bir değerinin ikinin tümleyenine eşittir. İkinin tümleyen aritmetiği kullanılırsa, o zaman:NOT x = −x − 1.İşaretsiz tamsayılar için, bir sayının bit düzeyinde tümleyeni, sayının işaretsiz tamsayı aralığının yarısı boyunca "ayna yansıması"dır. Örneğin, 8 bitlik işaretsiz tamsayılar için, NOT x = 255 - x, bir grafikte 0 ile 255 arasında artan bir aralığı 255 ile 0 arasında azalan bir aralığa etkili bir şekilde "çeviren" aşağı doğru bir çizgi olarak görselleştirilebilir.
