2012-02-08 33 views
7

Câu hỏi Java cơ bản hoàn toàn mà tôi đang gặp khó khăn khi tìm kiếm trên Google. Những gì hiện giá trị trung bình sau:Ký hiệu cho logic trong Java

(7 & 8) == 0? 

Có phải đó là tương đương với văn bản:

7 == 0 || 8 == 0? 

Tôi đã viết một chính nhanh chóng mà các xét nghiệm này, và nó có vẻ là như vậy. Tôi chỉ muốn chắc chắn rằng tôi không thiếu gì cả.

Trả lời

17

Không. &bitwise and. Nó thiết lập một chút nếu các bit tương ứng được thiết lập trong cả hai đầu vào. Vì ở dạng nhị phân, 7 là 111 và 8 là 1000, chúng không có điểm chung nào, do đó kết quả là 0.

Không thực sự có bất kỳ cú pháp viết tắt nào cho điều bạn đề xuất, không phải trên một dòng. Có một vài cách giải quyết - kiểm tra tư cách thành viên theo số Set hoặc BitSet, sử dụng tuyên bố switch - nhưng không có gì hiệu quả và chỉ ngắn như 7 == 0 || 8 == 0.

3

Đó là so sánh bit, hoạt động tốt vì bạn so sánh với 7 và 8, không được bảo đảm với các trường hợp khác. Nếu cả hai bit trong các số nguyên khớp nhau, bạn sẽ nhận được kết quả là '1' không phải '0'.

4

& là một toán tử AND khôn ngoan. Điều này có nghĩa rằng bạn đang ANDing các bit đại diện cho 8 và 7:

7 ->0111

8 ->1000

Mà rõ ràng dẫn đến 0.

wikipedia article này giải thích nó tốt với ví dụ chính xác của bạn cùng với việc giải thích các nhà khai thác bit-khôn ngoan khác.

10

& là bitwise AND. Với hai bit cho đầu vào, sau đây cung cấp cho các đầu ra chút bởi phép toán AND:

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

Trong trường hợp này,

7 in binary is 00000111 
8 in binary is 00001000 
       -------- 
       00000000, which is 0 in decimal. 

Giả sử bạn có 26 thay vì 8.

7 in binary is 00000111 
26 in binary is 00011010 
       -------- 
       00000010, which is 2 in decimal. 

Bitwise hoạt động được sử dụng để trích xuất và thao tác các trường được đóng gói thành một số.

Ví dụ: giả sử bạn có 3 trường được đóng gói thành một số, hai trong số 4 bit mỗi (0,15), một và 3 bit (0,7).

// n = aaaabbbbccc 

// Unpack the fields: 
a = (n >> 7) & 0xF; 
b = (n >> 3) & 0xF; 
c = (n >> 0) & 0x7; 

// Pack the fields: 
n = (a << 7) 
    | (b << 3) 
    | (c << 0); 
3

& là so sánh một chút, như đã đề cập, nhưng cũng có thể hoạt động như một mạch ngắn "và". Ví dụ:

if((x == 3) && (y = 3/0)){ 

sẽ luôn xảy ra lỗi.Tuy nhiên,

if((x == 3) & (y = 3/0)){ 

sẽ chỉ ném ra một lỗi nếu x bằng 3. Nếu x không bằng 3, java sẽ không bận tâm thẩm định phần còn lại của biểu thức vì False & bất cứ điều gì sẽ là False.

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