2013-01-16 33 views
6

OK, tôi đã được đưa ra một công thức để xác định một giá trị float giữa 0,0 và 1,0 sử dụng i và j (tọa độ của một giá trị trong một mảng 2D). Tôi chỉ đơn giản muốn biết chính xác công thức này làm gì. Nó làm cho không có ý nghĩa với tôi. Tôi đã thực hiện nó trong chức năng riêng của nó, trong đó các giá trị int của i và j được chuyển thành các tham số. Ai đó có thể cung cấp một lời giải thích? Tôi không cần phải hiểu nó, khi anh ấy đưa nó cho chúng tôi chỉ để sử dụng như vậy, nhưng tôi thực sự muốn biết.Công thức nổi này có nghĩa là gì?

float col = float (((i & 0x08) == 0)^((j & 0x08) == 0)); 

Chính xác những gì đang xảy ra ở đây?

+2

Bạn thường có thể tìm ra một biểu thức phức tạp bằng cách chia nhỏ nó thành các phần thành phần của nó. Bạn không hiểu phần nào? –

+0

Điều này thực sự không rõ ràng chút nào. Tôi không thể hình dung ra sau 2 phút. Vì vậy, tôi sẽ +1 cho nó. – Mysticial

+0

Mặt bên phải của biểu thức. Bản thân float() đang làm gì, trước hết. Sau đó, tôi không hiểu những gì (i & 0x08) nào. Tôi chưa bao giờ thấy điều đó trước đây. Tôi biết rằng & là một nhà điều hành tham khảo, nhưng nó là tham chiếu 0x08? 0x08 là gì? –

Trả lời

7

Kết quả, nếu được vẽ bằng i,j dưới dạng toạ độ x, y, sẽ là bàn cờ với các ô vuông 8x8 pixel.

i & 0x08j & 0x08 chỉ đang thử nghiệm một bit của mỗi trục. Bit đó sẽ thay đổi trạng thái mỗi 8 pixel.

== 0 sẽ chuyển đổi từng kết quả thành boolean, đánh giá thành 0 hoặc 1. Nó cũng đảo ngược kết quả, nhưng tôi không nghĩ nó có liên quan trong công thức chung.

Nhà cung cấp độc quyền hoặc ^ sẽ trả lại 0 nếu cả hai đều giống nhau hoặc 1 nếu chúng khác nhau. Đó là cách bạn có được bàn cờ - kết quả luân phiên mỗi lần i hoặc j vượt qua một ranh giới.

+0

+1! Bạn có sức mạnh đọc tâm trí? – mvp

+1

@mvp không, và có vẻ như tôi không đọc được. Nhìn lại các bình luận cho câu hỏi ban đầu, có vẻ như ai đó đã đạt đến kết luận tương tự 43 phút trước khi tôi làm vậy. –

+0

Tôi hiểu - đó là bởi @rici. Tuy nhiên, bạn quan tâm để thực sự gõ câu trả lời tuyệt vời này ở đây. – mvp

1
float col = float (((i & 0x08) == 0)^((j & 0x08) == 0)); 

& 0x08 hiện một bitwise và 8, có nghĩa là nó chiết xuất lần thứ 4 signficant nhất bit (1 là đơn giản nhất, sau đó 2, 4, 8) từ những con số ij. ^ là hoạt động OR độc quyền: nếu cả hai bit đều giống kết quả là 0, nếu chúng khác nhau kết quả là 1. Nếu được kết quả là float bên ngoài = float(...), vì vậy col trở thành 0.0 nếu ij giống nhau, nhưng 1.0 nếu chúng khác nhau.

Tại sao nó hữu ích? Điều đó tùy thuộc vào những gì ij. Có lẽ, bit thứ 4 mã hóa một số điều kiện cụ thể hoặc cờ (một boolean), ví dụ: cho dù một người là nam hay nữ. Hoạt động & trích xuất, sau đó ^ cho biết "chúng có khác nhau không?". Tại sao bạn có thể muốn một biểu thức boolean chuyển thành một phao? Không có nhiều lý do chính đáng để được trung thực - bạn luôn có thể để cho việc chuyển đổi được thực hiện ngầm tại nơi nó được sử dụng như trong (giả nam/nữ):

bool hetero = i & 0x08^j & 0x08; 
float estimated_children_from_coupling = 1.3 * hetero; // same as hetero ? 1.3 : 0; 
+1

Lưu ý: đó là ** không ** một dàn diễn viên kiểu C (có thể là '(float) blah'). –

+0

@OliCharlesworth: ah đúng ... C bị gỉ. Cảm ơn –

2

Có rất nhiều Boolean và bitwise boolean operators đây .. Hãy tôi cố gắng trả lời trong phần .. cho phép phân chia đầu tiên thành từng miếng

A:(i & 0x08)
Performing Bitwise và trên i - cơ bản và được thực hiện trên mỗi bit của i và 0x08 (1000 ở dạng nhị phân)

B:A==0
Kiểm tra nếu Bitwise và là sai cho mỗi bit Về cơ bản kiểm tra nếu các bit thứ 4 từ cuối cùng là 0

C: B^B'
Bitwise XOR- trả về 1 nếu một trong số họ và không được cả hai trong số đó là đúng (bitwise)

D:float(C)
Dễ dàng, giả sử C nổi.

End kết quả - Không có ý tưởng ..

0

Nói tóm lại, "col = 1.0" nếu "i" OR "j" bằng 0x08 (thập phân 8).

(i & 0x08): không không nếu "i == 0x08", không khác (i & 0x08) == 0: 1/đúng nếu "! I = 0x08", 0/false nếu "i = = 0x08 " tương tự cho" j "

Do đó," độc quyền hoặc "(^ toán tử) của 2 bên sẽ đúng với một trong hai điều đó là đúng, nhưng không phải cả hai, xảy ra khi i OR j là 0x08.

Cuối cùng, nó kết quả nổi lên vì bất kỳ lý do gì.

Các vấn đề liên quan