2013-06-23 42 views
30

Tôi đã đọc qua một số ví dụ về mã và đã xem một trang & trên trang web của Oracle trên trang Bitwise và Bit Shift Operators của họ. Theo tôi, nó không làm tốt công việc giải thích bitwise &. Tôi hiểu rằng nó thực hiện một thao tác trực tiếp với bit, nhưng tôi chỉ không chắc chắn loại hoạt động nào, và tôi tự hỏi đó là hoạt động gì. Đây là một chương trình mẫu tôi đã tắt trang web của Oracle: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.javaBitwise & (AND) hoạt động như thế nào trong Java?

+23

@jtahlborn Đây là điều tôi ghét về một số người dùng trong SO. Tại sao một người nào đó không hỏi trong stackoverflow đầu tiên? Có lẽ họ có một số kiến ​​thức trước đây, nhưng nghĩ rằng stackoverflow là nơi tốt nhất để có được câu trả lời của họ. – Mukus

+0

@TejaswiRana - nếu bạn không thể tìm thấy câu trả lời cho các vấn đề đơn giản trên web của bạn, sau đó hỏi những câu hỏi đó và nhận được câu trả lời thông qua SO sẽ gây hại nhiều hơn là tốt. bạn cần tìm hiểu cách tìm câu trả lời cho những thứ dễ dàng trước tiên. đôi khi, để thực sự giúp đỡ ai đó, bạn phải nói với họ sự thật khó khăn, không phải là câu trả lời dễ dàng. – jtahlborn

+13

@jtahlborn Nếu ai đó hỏi tôi nền tảng nào để đến một nhà ga xe lửa, tôi sẽ cho họ câu trả lời dễ dàng. Tôi không biết nếu đó chỉ là tôi, nhưng tôi cũng mong đợi điều tương tự từ những người khác. Tôi biết người đó có thể đã tìm kiếm trước khi đến nhà ga, nhưng thực tế là tôi biết họ có nhiều việc phải làm trong cuộc sống hơn là nghe một bài giảng nào đó, không có ý nghĩa gì với tôi để trả lời họ nhưng câu trả lời dễ dàng. – Mukus

Trả lời

53

Một số nguyên được biểu diễn dưới dạng một chuỗi các bit trong bộ nhớ. Để tương tác với con người, máy tính phải hiển thị nó dưới dạng chữ số thập phân, nhưng tất cả các phép tính được thực hiện dưới dạng nhị phân. 123 trong thập phân được lưu trữ dưới dạng 1111011 trong bộ nhớ.

Toán tử & là bit "Và". Kết quả là các bit được bật trong cả hai số. 1001 & 1100 = 1000, vì chỉ bit đầu tiên được bật trong cả hai.

Nhà điều hành | hơi "Hoặc". Kết quả là các bit được bật trên một trong các số. 1001 | 1100 = 1101, vì chỉ bit thứ hai từ phải là số không trong cả hai.

Ngoài ra còn có các toán tử ^~, có bit "Xor" và bitwise "Không" tương ứng. Cuối cùng, có các toán tử chuyển đổi <<, >>>>> shift.


Dưới mui xe, 123 được lưu giữ như một trong hai 01111011 00000000 00000000 00000000 hoặc 00000000 00000000 00000000 01111011 tùy thuộc vào hệ thống. Sử dụng toán tử bitwise, biểu diễn được sử dụng không quan trọng, vì cả hai biểu diễn được coi là số lôgic 00000000000000000000000001111011. Tước các số 0 đứng đầu 1111011.

+0

"123 trong thập phân được lưu trữ là 1111011 trong bộ nhớ" <- không hoàn toàn đúng ... Máy có thể có ít nhất là endian – fge

+5

Chi tiết triển khai. –

+0

Ồ không, không hoàn toàn như vậy ... Không có trong Java. JVM che dấu sự khác biệt cho bạn. Nhưng trong _memory_, biểu diễn phụ thuộc vào tính cuối cùng của máy. Đó là _very far_ từ một "chi tiết triển khai"! – fge

10

Đó là toán tử AND nhị phân. Nó thực hiện một hoạt động AND là một phần của Boolean Logic thường được sử dụng trên các số nhị phân trong máy tính.

Ví dụ:

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

Bạn cũng có thể thực hiện điều này trên số nhiều-bit:

01 & 00 = 00 
11 & 00 = 00 
11 & 01 = 01 
1111 & 0101 = 0101 
11111111 & 01101101 = 01101101 
... 
3

Nếu bạn mở rộng hai biến theo mã hex của họ, đây là những:

bitmask : 0000 0000 0000 1111 
val:  0010 0010 0010 0010 

Bây giờ, một đơn giản kết quả phép toán AND hoạt động trong số 0000 0000 0000 0010, mà trong đơn vị thập phân là 2. Tôi giả định bạn biết về các hoạt động và hệ thống số Boolean cơ bản.

2

Hoạt động logic của nó trên các giá trị đầu vào. Để hiểu việc chuyển đổi các giá trị thành dạng nhị phân và trong đó các bit bot ở vị trí n có 1 kết quả có 1. Ở cuối chuyển đổi trở lại.

Ví dụ với những giá trị Ví dụ:

0x2222 = 10001000100010 
0x000F = 00000000001111 
result = 00000000000010 => 0x0002 or just 2 
5

Nếu bạn nhìn vào hai con số trong hệ nhị phân, một Bitwise & tạo ra một số thứ ba mà có một 1 ở mỗi nơi mà cả hai con số có một 1. (Ở mọi nơi khác có số không).


Ví dụ:
0b10011011 &
0b10100010 =
0b10000010


Lưu ý rằng những người duy nhất xuất hiện ở một nơi khi cả hai đối số có một ở nơi đó.
Bitwise và hữu ích khi mỗi bit của một số lưu trữ một phần thông tin cụ thể.
Bạn cũng có thể sử dụng chúng để xóa/trích xuất một số phần nhất định bằng cách sử dụng mặt nạ.

-1
import.java.io.*; 
import.java.util.*; 

public class Test { 
    public static void main(String[] args) { 
     int rmv,rmv1; 

     //this R.M.VIVEK complete bitwise program for java 
     Scanner vivek=new Scanner(); 
     System.out.println("ENTER THE X value"); 
     rmv = vivek.nextInt(); 
     System.out.println("ENTER THE y value"); 
     rmv1 = vivek.nextInt(); 

     System.out.println("AND table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv&rmv1);//11=1,10=0 
     System.out.println("OR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv|rmv1);//10=1,00=0 
     System.out.println("xOR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv^rmv1); 
     System.out.println("LEFT SWITH based to %d>>4=%d\n",rmv<<4); 
     System.out.println("RIGTH SWITH based to %d>>2=%d\n",rmv>>2); 

     for(int v=1;v<=10;v++) 
      System.out.println("LIFT SWITH based to (-NAGATIVE VALUE) -1<<%d=%p\n",i,-1<<1+i); 
    } 
} 
+0

các máy nghiền bitwise dựa trên số không và các giá trị, AND, OR được sử dụng cho bảng chân lý dựa trên đầu ra –

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