Các thách thức
Thực hiện một hàm chấp nhận hai số nguyên có giá trị nằm trong khoảng từ 0 - 255 và trả về tổng của các số nguyên đó mod 256. Bạn chỉ có thể sử dụng phủ định bitwise (~), bitwise hoặc (|), toán tử dịch chuyển bit (>>, <<) và gán (=).
Những thứ bạn không thể sử dụng bao gồm (nhưng không giới hạn)
- Phép cộng, phép trừ, phép nhân và phép chia
- Vòng lặp
- Câu điều kiện
- Chức năng gọi
Ít sử dụng nhất của nhị phân hoặc, phủ định nhị phân và các hoạt động dịch chuyển bit sẽ thắng . Trong trường hợp hòa, giải pháp phổ biến nhất sẽ thắng. Như mọi khi, sơ hở tiêu chuẩn áp dụng.
Dưới đây là một ví dụ về bộ cộng 2 bit đơn giản. Nó sử dụng 77 phủ định nhị phân, 28 ors nhị phân và 2 bit bit cho tổng số 107 (có thể thấy điều này bằng cách chạy bộ tiền xử lý C với gcc -E
). Nó có thể được thực hiện hiệu quả hơn nhiều bằng cách loại bỏ các #define
s và đơn giản hóa các biểu thức kết quả, nhưng tôi đã để chúng rõ ràng.
#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));
}
}
}
}
Cập nhật: Đã thêm ví dụ và thay đổi phê bình chấm điểm