Bitwise Guide

Başlık Tag ( Bitwise Rehberi)

Bitwise Açıklaması

Bildiğiniz gibi, bilgisayarlardaki her şey en düşük düzeyde ikili. İkilik sistemindeki 1 ve 0'lara bit denir ve 8 biti bir bayt olarak adlandırılır.

Bitwise Operasyonları bu bitleri manipüle etmek için tasarlanmış fonksiyonlardır. Bu çeşitli nedenlerle kullanılabilir ancak genellikle programcının yeni bilgileri aynı miktarda alana saklaması amacıyla ikili 1'lerin ve 0'ların elle çevirilmesi için kullanılmaktadır. biraz. Kütüphane.

Açıklama:

Şimdi bitsiz işlemlerin ne olduğunu anladığınızı ve anlayışınızı güçlendirmek için bir örnek bıraktığınıza göre.

Aşağıda, bir RGBA değerini 32 bit uzunluklu int değere "paketleyen" bir kod fragmanı verilmiştir. Hexadecimal form).

-- Bunlar kullanışlı olsalar da, bitsiz işlemler için gerekli olmayan ileri bildirimler. local band = bit.band local bor = bit.bor local lshift = bit.lshift local rshift = bit.rshift -- RGBA değerini paketlemek local function rgb_to_hex(r,g,b, a) a = a or 255 return bor(lshift(r, 24), lshift(g, 16), lshift(b, 8), a) end -- RGBA değerinin paketlenmesi local function hex_to_rgb(hex) return rshift(hex, 24), rshift(band(hex, 0x00ff0000), 16), rshift(band(hex, 0x0000ff00), 8), band(hex, 0x000000ff) end

Şimdi bu işlemleri birebir bölüyoruz. Böylece bitlerin el ile çevirilmesi için işlemi nasıl kullandığımızı anlayabilirsiniz.

Paketleme Süreci

Başlamadan önce, geri vermek istediğimiz ikili sayının uzunluğunu görselleştirelim. Bir sayı iade etmek istiyorsak 32 bit göndermek istiyoruz:

00000000 00000000 00000000 00000000

Her boşluk bir baytı oluşturan 8 bit'i temsil eder.

Bu örnek için bizim r Değeri 255 olacak (İkili 111111111 adımdaki int'e ekleyelim:

00000000 00000000 00000000 00000000 -- Boş Int 00000000 00000000 00000000 11111111 255 --

Şimdi bu int'e daha fazla bit eklemek için önce 255 değerimizi yoldan çıkarmamız gerekiyor. bit.lshift function which kullanmak istediğimiz değeri alacak (255 or 11111111) ve soluna hareket ama n Bit miktarı.

Değerimizi başlangıç baytına taşımak istediğimiz için onu 24 bit sola taşıyacağız.

00000000 00000000 00000000 00000000 -- Boş Int 00000000 00000000 00000000 11111111 255 -- bit.lshift(255,24) 11111111 00000000 00000000 00000000

Bu işlevi sonraki her RGBA bileşeni için yapacağız:

r = 255 or 11111111 g = 200 or 11001000 b = 150 or 10010110 a - 255 or 11111111 - Takma kod. 00000000 00000000 00000000 00000000 -- Boş Int bit.lshift(r,24) -- 255'in r değerini ekleyerek ve hareket ettirerek 24 bit kaldı. 11111111 00000000 00000000 00000000 bit.lshift(g,16) -- 200'ün g değerini ekleyerek ve hareket ettirerek 16 bit kaldı. 11111111 11001000 00000000 00000000 bit.lshift(b,8) -- 150'nin b değerini toplayıp 8 bit kaldı. 11111111 11001000 10010110 00000000

Şimdi sadece son 8 bit (veya bayt) kaldığı için biz de ekleyebiliriz. a Son bitli işlemimizle değeri sona erdirdik.

  • bit.bor Operasyon burada sadece her şeyi bitsiz bir sayı olarak kapsayacak şekilde var. Bu kısım için hiçbir mantıksal fayda sağlamaz.
-- 255'in A değerini eklerken ki bu doğal olarak sonunda gerçekleşir. bit.bor(bit.lshift(r, 24), bit.lshift(g, 16), bit.lshift(b, 8), a) 11111111 11001000 10010110 11111111 -- Not: Şimdi bir araya getirdiğimiz ikili dizi yine de diğer sayılar gibi ondalık veya onaltılık olarak ifade edilebilir. 4291335935 -- Ondalık biçimi FFC896FF -- Hexadecimal

İşte paketleme işlemi için bu kadar. 4 sayısal değeri alıp 1 daha büyük değerle temsil ediyoruz.

Neden?

Bilgisayarın gördüğü gerçek bilgi parçalarını karşılaştırırsak bunu kolayca görebiliriz:

Eğer hedefimiz 4 numarayı depolamaksa (255, 200, 150, 255) Bilgisayar normalde bunları nasıl saklar. 11111111 00000000 00000000 00000000 00000000 11001000 00000000 00000000 00000000 00000000 10010110 00000000 00000000 00000000 00000000 11111111 - Her sayının düzgün bir şekilde temsil edilmesi için gereken tüm ekstra bitleri görüyorsunuz... -- Biz bitsiz fonksiyonlarımızı kullanarak tüm bu sayıları şöyle çevirdik: 11111111 11001000 10010110 11111111 - Gördüğünüz gibi fazladan bilgiyi boşa harcamıyoruz.

Paketlenme Süreci

Şimdi ne yaptığımızı bildiğiniz için paketleme işlemi çok daha kolaydır. Bilgilerimizi dışarı çıkarmamız gerekiyor.

Tek yapmamız gereken, çıkarmak istediğimiz değerleri izole etmek. Bunu hexadecimal değeri kullanarak yapabiliriz

0x00ff0000 == 11111111 00000000 00000000 0x0000ff00 == 11111111 00000000 0x000000ff == 11111111 -- ilk baytımızı çıkarmak için: 11111111 11001000 10010110 11111111 we will need to align the bits so our comparison works so we will need to shift our hex by 24 bytes to the right

Bit bayrakları

Bit bayrakları (veya bit bayrağı) tek bir sayının içinde depolanan, 32 bit tamsayı üzerindeki her bitin ayrı bir bayrak olduğu bayraklardır.

Doğaları gereği bitwise OR işlemini kullanarak birlikte birleştirilebilirler. bit.bor.

Örneğin: FL listesiBirleştiririz. FL_NPC (değer 16384) ve FL_GODMODE (değer 32768) böyle birleştirildi.

-- Diğer dillerde "myBitFlags = FL_NPC". local myBitFlags = bit.bor( FL_NPC, FL_GODMODE )

Bit bayrakları bitwise AND işlevi ile test edilebilir. Eğer yukarıdaki işlemi alır ve sonucunu bir değişkendeki kaydedersek, belirli bir bayrağın (veya birden fazlasının) aşağıdakiler gibi bir sayıda ayarlanıp belirlenmediğini sınayabiliriz:

-- Diğer dillerdeki "if (myBitFlags & FL_GODMODE )!= 0 () {}" eşdeğeri if ( bit.band( myBitFlags, FL_GODMODE ) ~= 0 ) then print( "The flag FL_GODMODE is set." ) end

Son olarak, bit işaretleri BAND ve NOT işlemleriyle kaldırılabilir:

-- Diğer dillerde "myBitFlags &= ~FL_GODMODE"nin eşdeğeri myBitFlags = bit.band( myBitFlags, bit.bnot( FL_GODMODE ) )

Bitsiz işlemler sıralı olan sayımlarda kullanılamaz, yani 1,2,3,4,5,6, vb. HUD listesi.

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord