Mình cần chọn một mục mảng dựa trên giá trị của 4 biến như hình dưới đây, trong C.
0 | 1 | 0 | -1 |
-1 | 0 | 1 | 0 |
0 | -1 | 0 |
1 | 0 | -1 | 0 |
1 | 0 | 0 | -1 |
1 | 0 | 0 | 1 |
-1 | 0 | 0 | 1 |
-1 | 0 | 0 | -1 |
0 | 1 | -1 | 0 |
0 | 1 | 1 | 0 |
0 | -1 | 1 | 0 |
0 | -1 | -1 | 0 |
(Thứ tự của cột thứ hai trong mảng không quan trọng và có thể sắp xếp lại nếu cần thiết.)
Mặc dù xếp tất cả các khả năng vào chuỗi 12 nếu như
là có thể (và hoàn toàn có thể chấp nhận được), nhưng tôi muốn xem liệu có ai có thể đưa ra giải pháp "sạch hơn" không.
biên tập: Để làm rõ: Tôi muốn một chức năng f(a,b,c,d)
Trong số đó (ví dụ)f(0, 1, 0, -1)
Quay lại để lưu vào mảng[1][0]
giá trị trong .
Để giải thích dễ dàng hơn, tôi đã mô tả giải pháp này theo cách kém hiệu quả hơn một chút; phiên bản ngắn gọn hơn có thể dễ dàng suy ra từ những gì tôi đã trình bày ở đây.
Ánh xạ các giá trị -1, 0 và 1 thành 0x00, 0x01 và 0x02 và lưu trữ chúng ở giá trị 8 bit sử dụng 2 bit cho mỗi giá trị, ví dụ: các giá trị mảng của bạn tương ứng với các số sau:
mảng [1] [0]: giá trị nhị phân 01100100 = 0x64
mảng [1] [1]: giá trị nhị phân 00011001 = 0x19
mảng [1] [2]: giá trị nhị phân 01000110 = 0x46
mảng [1] [3]: giá trị nhị phân 10010001 = 0x91
Tạo một mảng cho tất cả 255 giá trị có thể được giữ trong một giá trị 8 bit duy nhất (lưu ý rằng một số mục sẽ không được sử dụng, tức là với bất kỳ hai bit nào được đặt thành 1 - đây là tính không hiệu quả mà tôi đã đề cập).
例如
array[0] trỏ đến mảng thích hợp cho -1, -1, -1, -1
array[1] trỏ đến mảng thích hợp cho -1, -1, -1, 0
array[2] trỏ đến mảng thích hợp cho -1, -1, -1, 1
mảng [3] không có điểm nào
array[4] trỏ đến mảng thích hợp cho -1, -1, 0, -1
array[5] trỏ đến mảng thích hợp cho -1, -1, 0, 0
array[6] trỏ đến mảng thích hợp cho -1, -1, 0, 1
mảng [7] không có điểm nào
(v.v., rõ ràng)
Sau đó, bạn chỉ cần tra cứu, không lặp lại và lấy đúng mảng (hoặc bất cứ thứ gì bạn muốn đặt vào đó).
Trong một giải pháp sạch hơn, bảng không có mục nào trỏ vào đâu cả.
biên tập:
Trong trường hợp này, sử dụng mảng ở trên, hàm được yêu cầu là:
f(a,b,c,d) {
trả về mảng[(a+1) << 6 + (b+1) << 4 + (c+1) << 2 + (d+1)];
}
Tôi là một lập trình viên xuất sắc, rất giỏi!