Meydan okuma
Değerleri 0 - 255 arasında olan ve bu tamsayı mod 256'nın toplamını döndüren iki tamsayıyı kabul eden bir işlev uygulayın. Sadece bitsel olumsuzlama (~), bitsel veya (|), bit kaydırma operatörlerini (>>, <<) kullanabilirsiniz. ve atama (=).
Kullanamayacağınız şeyler şunları içerir (ancak bunlarla sınırlı değildir)
- Toplama, çıkarma, çarpma ve bölme
- döngüler
- Koşullu ifadeler
- İşlev çağrıları
İkili veya ikili negatifleme ve bit kaydırma işlemlerinin en az kullanımı kazanır . Beraberlik durumunda, en popüler çözüm kazanır. Her zaman olduğu gibi standart boşluklar uygulanır.
İşte basit bir 2-bit toplayıcı örneği. Toplam 107 puan için 77 ikili negatif, 28 ikili ors ve 2 bit kaydırma kullanır (bu, C ön işlemcisinin çalıştırılmasıyla görülebilir gcc -E
). Leri kaldırarak #define
ve elde edilen ifadeleri basitleştirerek çok daha verimli hale getirilebilirdi , ancak bunları netlik için bıraktım.
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
Güncelleme: Örnek eklendi ve puanlama ölçütünü değiştirdi