2010-07-22 29 views
36

Tôi đã có tuyên bố này trong Java:ống (|) nhà điều hành trong Java

System.out.println(3|4); 

Tại sao là sản phẩm 7?

+1

Bạn mong đợi điều gì? Và tại sao? – EJP

+0

@EJP: Mục đích của ký hiệu toán tử trong các ngôn ngữ lập trình là làm cho nó có thể sử dụng cùng một ký hiệu trong các chương trình của chúng ta mà chúng ta sử dụng trong phần còn lại của cuộc sống. Thanh dọc thường có nghĩa là * chia hết cho *, vì vậy trong khi tôi không thể nói cho OP, bản thân tôi sẽ mong đợi kết quả của '3 | 4' thành' false' chứ không phải '7' và tôi nghi ngờ rằng tất cả mọi người học toán ở trường trung học sẽ trông đợi như vậy. –

+2

Ở đây tại Hoa Kỳ, nơi Java đã được xác định, một thanh dọc không có gì để làm với bộ phận. Chúng tôi sử dụng các thanh ngang (đôi khi có các dấu chấm ở trên và dưới) và trong những dịp hiếm hoi có dấu gạch chéo phía trước. Không bao giờ là đường thẳng đứng. –

Trả lời

75

Đó là một Bitwise OR. Nó đang sửa đổi mọi thứ ở mức nhị phân.

   011      3 
in binary: | 100  in decimal: | 4 
      ___     ___ 
      111      7 

Mở Windows calc bằng chế độ khoa học. Bạn có thể lật giữa thập phân và nhị phân (và hex) và thực hiện các thao tác bitwise bao gồm hoặc, và, xor, v.v.

Để làm một bit hoặc trong đầu hoặc trên giấy, so sánh từng chữ số của cùng thứ tự. Nếu một trong hai số là 1, kết quả tại thứ tự đó sẽ là 1.

10

Nó đang làm một hoạt động bitwise OR, và 3 OR 4 là 7.

Xem ở đây: http://en.wikipedia.org/wiki/Bitwise_OR#OR

+3

Thật vậy. Để mở rộng về sự giải thích của dcp một chút, trong Java một đường ống đơn, '|', là cái được gọi là 'Bitwise OR'. Điều đó có nghĩa là nó thực hiện một mức OR thấp trên các bit thực tế tạo nên các đối số. Trong trường hợp này, 3 là '0011' và 4 là' 0100' (ít nhất 4 bit quan trọng được hiển thị). Một bitwise OR đi qua từng bit và đặt nó thành 1 nếu * hoặc * của các bit là 1, vì vậy trong trường hợp này bạn nhận được '0111', hoặc 7. Bạn đang thực sự cố gắng in ra, hoặc đây là một ví dụ từ một cuốn sách/hướng dẫn? – Stephen

+0

-1: Mục đích của SO là tạo câu trả lời dứt khoát. Điều này không giải thích tại sao '3 | 4 == 7' –

+0

cảm ơn vì đã trả lời – bentham

39

Nhà điều hành | thực hiện "bitwise OR". Đầu ra của bitwise OR trên hai bit là 1 nếu bit là 1 hoặc 0 nếu cả hai bit là 0. Bitwise OR trên hai số chỉ thực hiện một bitwise OR trên từng bit riêng lẻ.

Heres cách 3|4 công trình:

3: 00000011 
    4: 00000100 
-------------- 
3|4: 00000111 = 7 
+1

+1: minh họa '12 | 10' có thể là một ví dụ kỹ lưỡng hơn về bitwise-hoặc toán tử. Mặc dù OP ở đây yêu cầu cụ thể về '3 | 4' –

4

| là toán tử "bitwise hoặc". trong a | b, nếu bit thứ n của a và/hoặc b là 1, bit thứ n của kết quả sẽ là 1. 3 là 11 trong nhị phân. 4 là 100 ở dạng nhị phân.

0 1 1 
or or or 
1 0 0 
= = = 
1 1 1 

Và 111 xảy ra là biểu diễn nhị phân của 7.

8

đại diện nhị phân:

3 = 00000011 
4 = 00000100 

| is bitwise OR operator 

khi bạn HOẶC hai con số, bạn lấy biểu diễn nhị phân và OR kết quả là 1 IFF cho rằng cột ít nhất một cột được thiết lập đúng (1)

Vì vậy,

00000011 
00000100 
-------- 
00000111 

sau đó, cột cho bạn biết giá trị tại vị trí đó:

128, 64, 32, 16, 8, 4, 2, 1 

nên

128, 64, 32, 16, 8, 4, 2, 1 
0 , 0, 0, 0, 0, 1, 1, 1 

bất kỳ cột với 1 nghĩa là bạn thêm giá trị của cột đó:

4 + 2 + 1 = 7 
2

khai thác Như Bitwise có thể là một chút bối rối mà không cần một cái gì đó tương quan họ, cách tôi đã giải thích chức năng của họ cho người không lập trình thậm chí là bạn chỉ cần đặt 1 cho đúng và 0 cho sai, và sau đó họ cư xử giống hệt với toán tử bằng ngôn ngữ tiếng Anh:

Mặt trăng là màu xanh và bầu trời có màu xanh, là sai

0 và 1 là 0

mặt trăng có màu xanh hoặc bầu trời là màu xanh, là đúng

0 hoặc 1 là 1

nhưng sự tương tự bị phá vỡ khi tôi nhận được để:

đại dương là XOR màu xanh cây xanh, là sai

+0

Để giải thích XOR, một cái gì đó như" Bạn có thích bánh kem XOR cho món tráng miệng không? " có thể minh họa. :) Trường hợp điển hình trong đó ngôn ngữ tự nhiên "hoặc" thực sự có nghĩa là "hoặc không phải là cả hai". – Jonik

4

đó là hữu ích để nhận ra có một hệ thống tổng quát cho đếm cơ bản này. Binary là base-2. Số thập phân quen thuộc là base-10. Alpha bát quyền cho phép là cơ sở 8.

Giá trị của một số được lấy bằng cách cộng các giá trị riêng lẻ của từng chữ số của nó. Đối với bất kỳ chữ số nào, giá trị được lấy từ một công thức đơn giản.

(chữ số) * (cơ sở)^(số nơi ở phía bên trái dấu thập phân)

123 = 123 = (1 * 10^2) + (2 * 10^1) + (3 * 10^0) = 100 + 20 + 3

Tôi đã học được rằng trong CS211 (không khoe khoang, chỉ cần ghi nhớ)