ความท้าทาย
ใช้ฟังก์ชั่นที่รับจำนวนเต็มสองจำนวนซึ่งมีค่าอยู่ในช่วงตั้งแต่ 0 - 255 และส่งคืนผลรวมของจำนวนเต็ม mod 256 เหล่านั้นคุณสามารถใช้การปฏิเสธ bitwise (~), bitwise หรือ (|), ตัวดำเนินการเปลี่ยนบิต (>>, <<) และและการมอบหมาย (=)
สิ่งที่คุณไม่สามารถใช้รวมถึง (แต่ไม่ จำกัด เฉพาะ)
- การบวกการลบการคูณและการหาร
- ลูป
- คำสั่งแบบมีเงื่อนไข
- ฟังก์ชั่นการโทร
ใช้น้อยที่สุดของไบนารีหรือปฏิเสธไบนารีและกะบิตชนะการดำเนินงาน ในกรณีที่เสมอกันโซลูชันที่ได้รับความนิยมมากที่สุดจะเป็นผู้ชนะ เช่นเคยใช้ช่องโหว่มาตรฐาน
นี่คือตัวอย่างของแอดเดอร์ 2 บิตที่เรียบง่าย มันใช้การปฏิเสธไบนารี 77 รายการไบนารี ORS 28 รายการและ 2 บิตกะเป็นคะแนนรวม 107 (สามารถดูได้จากการรัน C preprocessor ด้วยgcc -E
) มันสามารถทำให้มีประสิทธิภาพมากขึ้นโดยการลบ#define
s และลดความซับซ้อนของการแสดงออกที่เกิดขึ้น แต่ฉันได้ทิ้งไว้เพื่อความชัดเจน
#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));
}
}
}
}
อัปเดต: เพิ่มตัวอย่างและเปลี่ยนเกณฑ์การให้คะแนนแล้ว