Tantangan
Menerapkan fungsi yang menerima dua bilangan bulat yang nilainya berkisar antara 0 - 255 dan mengembalikan jumlah bilangan bulat itu mod 256. Anda hanya dapat menggunakan negasi bitwise (~), bitwise atau (|), operator pemindahan bit (>>, <<) , dan penugasan (=).
Hal-hal yang tidak dapat Anda gunakan termasuk (tetapi tidak terbatas pada)
- Penambahan, pengurangan, penggandaan, dan pembagian
- Loop
- Pernyataan bersyarat
- Panggilan fungsi
Penggunaan paling sedikit dari operasi biner atau, negasi biner, dan bit shift menang . Dalam hal seri, solusi yang paling populer menang. Seperti biasa, celah standar berlaku.
Berikut adalah contoh dari penambah 2-bit yang sederhana. Ia menggunakan 77 negasi biner, 28 bit biner, dan 2 bit-shift untuk skor total 107 (ini dapat dilihat dengan menjalankan preprosesor C bersama gcc -E
). Itu bisa dibuat jauh lebih efisien dengan menghapus #define
dan menyederhanakan ekspresi yang dihasilkan, tetapi saya meninggalkannya untuk kejelasan.
#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));
}
}
}
}
Perbarui: Menambahkan contoh dan mengubah kriteria penilaian