Toán tử Bitwise & vs Lôgic &&

1. Giới thiệu

Trong Java, chúng ta có hai cách để nói “VÀ”. Nhưng sử dụng cái nào?

Trong hướng dẫn này, chúng ta sẽ xem xét sự khác biệt giữa & và &&. Và, chúng ta sẽ tìm hiểu về các hoạt động bitwise và đoản mạch trên đường đi.

2. Sử dụng Bitwise AND

Toán tử AND (&) theo bitwise so sánh từng chữ số nhị phân của hai số nguyên và trả về 1 nếu cả hai đều là 1, ngược lại, nó trả về 0.

Hãy xem xét hai số nguyên:

int six = 6; int five = 5;

Tiếp theo, hãy áp dụng toán tử AND bitwise cho các số sau:

int resultShouldBeFour = six & five; assertEquals(4, resultShouldBeFour);

Để hiểu thao tác này, hãy xem biểu diễn nhị phân của mỗi số:

Binary of decimal 4: 0100 Binary of decimal 5: 0101 Binary of decimal 6: 0110

Toán tử & thực hiện một AND logic trên mỗi bit và trả về một số nhị phân mới:

0110 0101 ----- 0100

Cuối cùng, kết quả của chúng tôi - 0100 - có thể được chuyển đổi lại thành số thập phân - 4 .

Hãy xem đoạn mã Java thử nghiệm:

int six = 6; int five = 5; int resultShouldBeFour = six & five; assertEquals(4, resultShouldBeFour);

2.1. Sử dụng & với Booleans

Ngoài ra, chúng ta có thể sử dụng toán tử bitwise AND ( & ) với các toán hạng boolean . Nó chỉ trả về true nếu cả hai toán hạng đều đúng , nếu không, nó trả về false.

Hãy lấy ba biến boolean :

boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false;

Tiếp theo, hãy áp dụng toán tử AND bitwise trên các biến trueBoolanotherTrueBool :

boolean trueANDtrue = trueBool & anotherTrueBool;

Khi đó, kết quả sẽ là true .

Tiếp theo, hãy áp dụng toán tử AND bitwise trên trueBoolfalseBool :

boolean trueANDFalse = trueBool & falseBool;

Trong trường hợp này, kết quả sẽ là sai .

Hãy xem đoạn mã Java thử nghiệm:

boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false; boolean trueANDtrue= trueBool & anotherTrueBool; boolean trueANDFalse = trueBool & falseBool; assertTrue(trueANDtrue); assertFalse(trueANDFalse);

3. Sử dụng logic AND

Giống như & , toán tử logic AND ( && ) so sánh giá trị của hai biến hoặc biểu thức boolean. Và, nó cũng chỉ trả về true nếu cả hai toán hạng đều đúng , nếu không, nó trả về false .

Hãy lấy ba biến boolean :

boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false;

Tiếp theo, hãy áp dụng một toán tử logic AND trên các biến trueBoolanotherTrueBool :

boolean trueANDtrue = trueBool && anotherTrueBool;

Khi đó, kết quả sẽ là true .

Tiếp theo, hãy áp dụng một toán tử logic AND trên trueBoolfalseBool :

boolean trueANDFalse = trueBool && falseBool;

Trong trường hợp này, kết quả sẽ là sai .

Hãy xem đoạn mã Java thử nghiệm:

boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false; boolean anotherFalseBool = false; boolean trueANDtrue = trueBool && anotherTrueBool; boolean trueANDFalse = trueBool && falseBool; boolean falseANDFalse = falseBool && anotherFalseBool; assertTrue(trueANDtrue); assertFalse(trueANDFalse); assertFalse(falseANDFalse);

3.1. Ngắn mạch

Vậy, sự khác biệt là gì? Vâng, các && điều hành ngắn mạch. Điều này có nghĩa là nó không đánh giá toán hạng hoặc biểu thức bên phải khi toán hạng hoặc biểu thức bên trái là sai .

Hãy lấy hai biểu thức đánh giá là sai:

First Expression: 2<1 Second Expression: 4<5 

Khi chúng ta áp dụng toán tử logic AND trên các biểu thức 2 <14 <5, thì nó chỉ đánh giá biểu thức đầu tiên 2 <1 và trả về false.

boolean shortCircuitResult = (2<1) && (4<5); assertFalse(shortCircuitResult);

3.2. Sử dụng && với Số nguyên

Chúng ta có thể sử dụng toán tử & với kiểu boolean hoặc kiểu số nhưng && chỉ có thể được sử dụng với toán hạng boolean. Sử dụng nó với các toán hạng số nguyên dẫn đến lỗi biên dịch:

int five = 2; int six = 4; int result = five && six;

4. So sánh

  1. Toán tử & luôn đánh giá cả hai biểu thức, trong khi toán tử && chỉ đánh giá biểu thức thứ hai nếu biểu thức đầu tiên đúng
  2. & so sánh từng toán hạng theo chiều dọc bit, trong khi && chỉ hoạt động trên boolean

5. Kết luận

Trong bài viết này, chúng tôi đã sử dụng toán tử bitwise & để so sánh các bit của hai chữ số dẫn đến một chữ số mới. Ngoài ra, chúng tôi đã sử dụng toán tử logic && để so sánh hai boolean, dẫn đến một giá trị boolean.

Chúng tôi cũng đã thấy một số khác biệt chính giữa hai nhà khai thác.

Như mọi khi, bạn có thể tìm thấy mã cho hướng dẫn này trên GitHub.