Soru Hiç gerçek projelerde biraz değişmek zorunda kaldınız mı?


Hiç kullanmak zorunda kaldın mı bit kayması gerçek programlama projelerinde? Çoğu (eğer olmasa bile) yüksek seviyeli dillerin içinde vardiya operatörleri vardır, ancak bunları gerçekten ne zaman kullanmanız gerekir?


76


Menşei




Cevaplar:


Hala donanımda kayan nokta desteği olmayan sistemler için kod yazarım. Bu sistemlerde neredeyse tüm aritmetikleriniz için bit kaydırmaya ihtiyacınız var.

Ayrıca karma oluşturmak için vardiya ihtiyacınız var. Polinom aritmetiği (CRC, Reed-Solomon Kodları ana uygulamalardır) veya vardiyaları kullanır.

Bununla birlikte, vardiyalar sadece kullanıldıkları için kullanıldıkları ve yazarın tam olarak ne ifade ettiklerini ifade ettikleri için kullanılır. İsterseniz, tüm bit vardiyalarını çarpma ile öykünebilirsiniz, ancak yazmak daha zor, daha az okunabilir ve bazen daha yavaş olur.

Derleyiciler, çarpmanın bir vardiyaya indirilebileceği durumları tespit eder.


49





Evet, onları çok kullandım. Bit-maskelerinin çok yaygın olduğu gömülü donanımlarda bit twiddling önemlidir. Her son performansa ihtiyaç duyduğunuzda, oyun programlamasında da önemlidir.

Düzenle: Ayrıca, bitmap'leri manipüle etmek için, örneğin renk derinliğini değiştirmek veya RGB <-> BGR'yi dönüştürmek için çok kullanırım.


35



Destekliyorum. Çok fazla gömülü programlama yapıyorum ve bit değişimi yaygın bir işlemdir. - e.James
RGB <-> BGR dönüşümleri burada. - Neil N


  • Enumlar için güzel bayrak değerleri yaratmak (elle 1, 2, 4 ... yazmak yerine)
  • Verileri bit alanlarından açmak (birçok ağ protokolü bunları kullanır)
  • Z eğrisi geçişi
  • Performans kesmek

Ve kullanıldıklarında pek çok durum düşünemiyorum. Bu genellikle başka bir yoldur - bazı özel problemler vardır ve bit operasyonlarının kullanılmasının en iyi sonuçları (genellikle performans - zaman ve / veya alan) vereceği ortaya çıkmaktadır.


24



Örneğin ikiyi saklamak için buna ihtiyacınız olabilir shortbirinde intIki ayrı değerleri okumak için Okuma okuma ve kilitleme olmadan ASP.net oturumu durumunda eger alanı. Ayrıca oturumda iki değeri saklamanın bellek yükü de kaydedilir. - David d C e Freitas


Onları her zaman kullandığım bir yer, platformlar arası uygulamalar için tamsayıların endeksini transpoze ederken. Ayrıca, 2D grafikleri karıştırırken bazen (diğer bit manipülasyon operatörleri ile birlikte) kullanışlı olurlar.


14



İkincisi, EBCDIC karakter seti için bir dönüştürücü yazıyor. Ne yazık ki, bu, yüksek düzeyde bir dilde düşük seviyeli bir çalışma yapmakta, ancak bazı durumlarda gereklidir. - Michael Meadows


Onları birkaç kez kullandım, ama her zaman bir ikili dosya formatını ayrıştırmak için.


8





Makul makale burada: http://greatjustice.info/the-lost-art-of-bitmasks/


6



Bu link şimdi bir 404 verir - Bryan Oakley
hala buradan erişebilirsiniz: web.archive.org/web/20090406021150/http://greatjustice.info/... - Software Guy


Bit vardiyaları hızlıdır. Bölme ve modül operasyonlarından çok önce CPU komut setlerinde uygulandılar. Birçoğumuz kalem ve kağıt üzerinde basit ama CPU'larımızda bulunmayan aritmetik için bit vardiyalarını kullandık.

Örneğin:

  • Projeler için biraz vardiya kullandım büyük kompozitleri faktoring içeren ana faktörlerine.
  • Ben de bit vardiyalarını kullandım kare ve küp kökü bulma keyfi büyük tamsayılar.

6



Küpü veya karekökünü bulmak için nasıl kullandığınızı bir örnek olarak gönderir misiniz? Bunun nasıl yapılacağını göremiyorum. - Xsmael


Evet, hala gerekli.

İşte işimde örneğin, seri port COMx üzerinden PLC ile iletişim için yazılımlar geliştiriyoruz. Bir bayt içinde bitleri işlemek için gereklidir, sola kaydırma / sağa ve mantıksal işleçler OR, XOR ve AND'ı gün içinde kullanırız.

Örneğin, bir baytın bit 3'ünü (sağdan sola) açmamız gerektiğini varsayalım:

Yapılması çok daha verimli:

Byte B;

B := B XOR 4;

Yerine:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

Saygılarımızla.


5



Neden 4'ün bit 3 ile ilişkili olduğunu eklemek isteyebilirsiniz (sağdan sola) - HCP
Neden [5]? S olmaz mı [2]? - IamIC
B: = BXOR4; Bu durumda, belirli bir bit açmak için, sadece OR değil mi? XOR geçiş yapmak için kullanılmadı mı? stackoverflow.com/questions/47981/... - Hari


Assembly dilinde yazdığımda, kodum bit kaydırma ve maskeleme ile doluydu.

C de adil bir miktar mıydı.

JavaScript veya sunucu dillerinde fazla yapmadım.

Muhtemelen en iyi modern kullanım, birler ve sıfırlar olarak temsil edilen dolu bir boole değerleri dizisini atmaktır. Her zaman kaymayı bıraktım ve montajda işaret biti olup olmadığını kontrol ettim, fakat daha yüksek dilde bir değerle karşılaştırırsınız.

Örneğin, 8 bite sahipseniz, üst biti "eğer (a> 127) {...}" ile kontrol edersiniz. Sonra vardiya (ya da 2 ile çarpın), bir "ve" ile 127 (ya da son biti ayarlanmışsa 256 çıkartma) yapın ve tekrar yapın.


4





Onları, bir bitmap'deki bitlerin sıkıştırıldığı görüntü sıkıştırma / dekompresyonunda çok kullandım. kullanma http://en.wikipedia.org/wiki/Huffman_coding Sıkıştırılmış olan şeyler çeşitli sayıda bitten oluşur (hepsi bayt hizalanmış değildir) ve bu nedenle bunları kodlarken veya deşifre ettiğinizde bunları bitiştirmeniz gerekir.


3