2016-04-13 22 views
7

"Making a basic algorithm"'un düzenleme geçmişine bakın. OP'nin bu soruyu değiştirdiği ve bazı ilginç cevapları geçersiz kıldığı zaman, katılımcılar arasında bir hayal kırıklığı hissedildi. Öyleyse, neden bu soruların cevap vermesine izin vermek için orijinal soruyu tekrar sormadığımı düşünüyorum. boyut 2'ye eşittir ve daha sonra her yeni hat son boyut kontrolü için 4 eklerseniz Yani temelde kontrolTemel bir algoritma oluşturma - daha ilginç sürüm

if(size == 2) unit /= 2; 
if(size == 2 || size == 6) unit /= 2; 
if(size == 2 || size == 6 || size == 10) unit /= 2; 

:

Böylece temelde bunun için daha kolay bir yol bulmak istiyoruz .

Bunu yapmanın orada eğer bir kolay yolu bilmek istiyorum 256

kadar gitmek gerekir.

+1

Bunu yaptığınız için sizi alkışlıyorum. –

+0

Bunu açıklayıcı bir başlık veya açıklama verebilir misiniz, böylece ileride birisi için yararlı olabilir mi? "Temel algoritma" arayışında olan hiç kimse bunun karşısına çıkmayacak. –

+0

@ Herhangi bir öneriniz var mı? –

cevap

9

burada eşitlik açısından kontrol numaraları temel kriter size/4 arasında kaldığını olan bu modül operatörü, % kullanılarak tespit edilebilir 2'dir:

size % 4 == 2 

O zaman nasıl sorusu vardır pek çok kez yukarıdaki örnekler için 2 ile unit bölmek:

  • size == 2 için, unit /= 8 (3 koşullarına uygun);
  • size == 6, unit /= 4 için (ikinci 2 koşulu eşleştir);
  • size == 10, unit /= 2 için (son koşulu eşleşir).

Yani daha az sayıda, kontrol maksimum size 10 ise o 8. bölünür kez daha, unit2^(1 + (10 - size)/4) bölünür. Bu öz sağa kaydırma operatörü kullanılarak ifade edilebilir:

unit >>= 1 + (10 - size)/4 

ya da daha genel: max_number % 4 == 2

unit >>= 1 + (max_number - size)/4 

.

Ayarı max_number = 254 (256 soruda belirtilir, ancak ifadede yer almaz; son sayı 254 olarak işaretlenir) ve bu cevabı yalnızca 2 <= size <= 254 olarak uygularsak, şu son cevabı şu şekilde ifade edebiliriz: belirtildiği gibi

if ((size & 0xffffff03) == 2) 

:

if (size % 4 == 2 && size >= 2 && size <= 254) { 
    unit >>= 1 + (254 - size)/4; 
} 

Aslında, bu durum (fakat hiç şüphesiz daha okunabilmektedir) daha fazla öz ifade edilebilir @PaulBoddington tarafından, dikkat doğru vardiya ile alınmalıdır: eğer birim bir int ise ve kaydırılan bit sayısı 31'den büyükse, o zaman unit basitçe sıfıra ayarlanmalıdır.

+1

Bu, 'unit' türüne bağlıdır. Eğer birim “int” ise, vardiya tutarları modulo 32 olarak okunur, bu yüzden “int p = 1 + (254 - size)/4; birim = p> 31? 0: birim >> p; '. –

+0

@PaulBoddington çok doğru. –

İlgili konular