Bitsel işlemleri kullanmanın avantajları nelerdir? [kapalı]


19

En son CodeProject bültenini okuduktan sonra, bu makalede bitsel işlemler ile karşılaştım . İlginç bir okuma yapar ve kesinlikle bir tamsayının çift mi yoksa tek mi olduğunu kontrol etmenin faydasını görebilirim, ancak n-bit bitinin ayarlanıp ayarlanmadığını test edebilirim? Bunun avantajları neler olabilir?

Yanıtlar:


27

Tümleşik sistemlerde donanım kayıtlarını programlarken bitsel işlemler kesinlikle gereklidir. Örneğin, şimdiye kadar kullandığım her işlemcide, kesmenin etkin olup olmadığını kontrol eden bir veya daha fazla kayıt (genellikle belirli bir bellek adresi) vardır. Bir kesmenin ateşlemesine izin vermek için, olağan işlem, bir kesme tipi için etkinleştirme bitini ayarlamak, en önemlisi, kayıttaki diğer bitlerin hiçbirini değiştirmektir.

Bir kesinti tetiklendiğinde, genellikle bir durum kaydında bir bit ayarlar, böylece tek bir hizmet yordamı kesinti nedenini kesin olarak belirleyebilir. Ayrı bitlerin test edilmesi, kesme kaynağının hızlı bir şekilde çözülmesini sağlar.

Birçok gömülü sistemde kullanılabilir toplam RAM 64, 128 veya 256 BYTES (kilobayt veya megabayt değil bayttır) olabilir Bu ortamda, birden fazla veri öğesini, boole bayraklarını vb. Saklamak için bir bayt kullanmak ve bit işlemlerini kullanmak yaygındır. ayarlamak ve okumak için.

Birkaç yıldır mesaj yükünün 10.5 bayt olduğu bir uydu iletişim sistemi ile çalışıyorum. Bu veri paketini en iyi şekilde kullanabilmek için, alanlar arasında kullanılmayan bitler bırakmadan bilgilerin veri bloğuna paketlenmesi gerekir. Bu, bilgi değerlerini almak ve bunları aktarılan yüke paketlemek için bitselin geniş ölçüde kullanılması ve operatörlerin kaydırılması anlamına gelir.


4
Daha fazla boolean bit işlemi ve optimizasyonu ile ilgilenenler için Hacker'ın
Lokumu'na

7

Temel olarak, bunları boyut ve hız değerlendirmeleri nedeniyle kullanırsınız. Bitsel işlemler inanılmaz derecede basittir ve bu nedenle genellikle aritmetik işlemlerden daha hızlıdır. Örneğin bir rgb değerinin yeşil kısmını elde etmek için aritmetik yaklaşımdır (rgb / 256) % 256. Bitsel işlemlerle bir şey yaparsınız (rgb >> 8) & 0xFF. İkincisi önemli ölçüde daha hızlıdır ve alıştıktan sonra daha da kolaydır. Verileri kompakt ve hızlı bir şekilde kodlamanız / deşifre etmeniz gerektiğinde genellikle bitsel işlemler çok fazla devreye girer.


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

Bu tür işlemler genellikle bellek veya CPU gücünün kısıtlandığı gömülü sistemler için yazarken kullanılır.

Örneğin, yerden tasarruf etmek için, bir boole değerini temsil etmek üzere her biti kullanarak tek bir 8 bit int değişkeninde birden çok değişken depolayabilirsiniz. Sonra belirli bir bit ayarlamak veya bit değerini almak için hızlı bir yol gerekir.

Genellikle Gigabyte belleğe sahip bir masaüstü bilgisayarda C # gibi daha üst düzey dillerde programlama yaparken, her birinin bool bir bayt kaplamasını gerçekten umursamazsınız . Ancak C'de 2kb bellekle bir mikrodenetleyici programlıyorsanız, her bir bit sayılır, bu nedenle 8 bools'u tek bir bayta paketleme yeteneği kritik olabilir.


.NET, bir bit alanı olarak [Flags]kullanılmasına izin veren özniteliğe sahiptir Enum. Örneğin, kalın, italik, altı çizili ve üstü çizili bir bit alanı olan Fontbir Styleözelliğe sahiptir.
deltreme

@deltreme. Evet, [Bayraklar] kullanabileceğini biliyorum, ama mesele bu değil. Mesele şu ki, yüksek seviyeli dillerde, birkaç bool için birkaç bayt alan kullanmayı umursamıyorsunuz. Genel olarak, sürdürülebilirlik ve kod okunabilirliği konusunda daha fazla önem verirsiniz. Boyutu önemsediğiniz gömülü sistemlerde, .net [Flags] özniteliği gibi şeylere erişiminiz yoktur, bu nedenle bu bitsel işlemleri kullanabilirsiniz.
Simon P Stevens

"ancak n'inci bitin ayarlanıp ayarlanmadığını test ediyor musunuz? Bunun avantajları neler olabilir?" bu nokta - ama hiçbir dil belirtilmediğinden, C # 'dan bahsedildiği bir cevaba yorum olarak girmeye karar verdim. Cevabınıza bir yorum değil, bir ek, bilmek güzel ya da her neyse.
07'de deltreme deltreme

@deltreme: Oh, güzel.
Simon P Stevens

3

Bitsel işlemler, gömülü elektroniklerde olduğu gibi video ve ses kodeklerinde de sıklıkla kullanılır; süper bayraklı bir kod çözücü yapmak istediğinizde beş bayrağı ve on bir bit zamanlayıcıyı yarım int olarak paketlemek çok yararlıdır.

Aslında, MPEG 4 değişken bit uzunluklu alanlar için üstel Golomb kodlaması bile kullanır . Son paketin 17 veya 19 bit genişliğindeki bir değer bu paketin yalnızca üç veya beş bit genişliğinde olabilir ve tüm bunları bitsel işlemlerle anlayabilirsiniz.


2

Bitsel mantıksal işlemleri, bitsel kaydırma işlemlerini ve aritmetik işlemleri birleştiren hileler, mantık geçitleri (ve, veya değil) kullanarak bir ikili toplayıcının yapımını inceleyen kişiler tarafından anlaşılabilir. Bu dairenin dışında, ayrıntılı bir yorum yapmadan anlamak çok zordur.

SIMD ünitelerini programlarken , özellikle CPU mimarisi kasıtlı olarak bazı SIMD talimatlarını dışarıda bırakmışsa yararlıdır çünkü bunlar birkaç kişi tarafından taklit edilebilir.

Örneğin, mimari, 16 baytlık bir grubun negatif değerlerini almak için herhangi bir talimat tanımlamayabilir, ancak bu, bitsel olarak olumsuzlama ve daha sonra 1 ekleyerek taklit edilebilir. Benzer şekilde, çıkarma da taklit edilebilir. ikinci işlenenin negatifi. "Alternatif rota" nın kullanılabilirliği, belirli talimatları atlamanın nedenidir.

Benzer şekilde, SIMD, 16 bit, 32 bit veya 64 bit gibi daha geniş öğeler için ek uygulamadan yalnızca paralel 8 bit eklemeyi destekleyebilir. Onları taklit etmek için, işaret bitini 8 bit hesaplama sonucundan çıkarmanız ve ardından bir sonraki elemanda taşıma işlemini gerçekleştirmeniz gerekir.


0

Paketleme verileri, daha hızlı ops (çarpma, bölme ve modül 2 güçlerine hizalandığında önemli ölçüde daha hızlıdır), bit çevirme vb. Bunları öğrenin ve kullanmaya başlayın ve avantajların çoğunu kendi başınıza görmeye başlayın.


1
Bu oldukça dik bir cevap.
itsbruce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.