2009-03-15 47 views

Trả lời

12

Bitwise AND. Trong trường hợp này, kiểm tra xem bit cuối cùng trong i có được đặt hay không. Nếu có, nó phải là một số lẻ vì bit cuối đại diện cho 1 và tất cả các bit khác đại diện cho số chẵn.

2

Đó là kiểm tra xem bit cuối cùng đã bật chưa (làm cho nó trở nên lạ). Lưu ý rằng không phải là đặc biệt để linq, bạn có thể làm điều đó trên sql hoặc C# code.

4

'&' là bitwise and operator. & 'ing với 1 loại bỏ tất cả các chữ số nhị phân khác, để 0 nếu số đó là chẵn, 1 nếu nó là số lẻ.

Đó là cách của hacker. Tất nhiên, một nhà toán học sẽ viết ((i% 2) == 1), sử dụng modulo 2 arithmetic! Trong khi đó, một kỹ sư phần mềm sẽ viết IsEven (i), tái sử dụng chức năng thư viện và kiếm lại các điểm brownie ... :-)

Bây giờ, liệu có hiệu quả hơn hay không phụ thuộc vào trình biên dịch và CLR - và trong trường hợp này, cũng trên người được xử lý cây biểu thức LINQ và những gì người nhận đó được chuẩn bị để giải quyết.

+0

Tôi tin rằng & hoạt động sẽ hiệu quả nhất về mặt kỹ thuật. –

+0

Đừng quá chắc chắn. Trình biên dịch và trình xử lý IL JIT có mức độ tự do lớn hơn bạn tưởng tượng ... –

+0

Một kỹ sư phần mềm thích sử dụng các phương pháp mở rộng cho rõ ràng và ngắn gọn C# có thể viết i.IsNotEven(). –

4

& là một toán tử AND và AND, là một trong các thao tác cơ bản trong hệ nhị phân.

VÀ có nghĩa là 'nếu cả A và B đều bật'. Ví dụ thế giới thực là hai công tắc trong chuỗi. Dòng điện sẽ chỉ truyền qua nếu cả hai đều cho phép dòng điện chạy qua.

Trong máy tính, đây không phải là công tắc vật lý mà là chất bán dẫn và chức năng của chúng được gọi là logic gates. Chúng làm cùng loại thứ như các công tắc - phản ứng với dòng điện hoặc không dòng điện.

Khi áp dụng cho số nguyên, mỗi bit trong một số được kết hợp với mọi bit trong số khác. Vì vậy, để hiểu toán tử bitwise AND, bạn cần chuyển đổi các số thành nhị phân, sau đó thực hiện thao tác AND trên mỗi cặp bit khớp.

Đó là lý do tại sao:

00011011 (odd number) 
AND 
00000001 (& 1) 
== 
00000001 (results in 1) 

Trong khi

00011010 (even number) 
AND 
00000001 (& 1) 
== 
00000000 (results in 0) 

The (& 1) hoạt động do đó so sánh phải hầu hết chút tới 1 sử dụng AND logic. Tất cả các bit khác được bỏ qua một cách hiệu quả bởi vì bất cứ điều gì VÀ không có gì là không có gì.

Điều này tương đương với việc kiểm tra xem con số có phải là một số lẻ hay không (tất cả các số lẻ có bit phải bằng 1).

Ở trên được điều chỉnh từ một câu trả lời tương tự tôi đã viết cho this question.