2012-05-02 33 views
11

Tôi thấy điều này trong một số mã JS:Các toán tử ">>" (mũi tên kép) và "|" (ống đơn) có nghĩa là trong JavaScript?

 index = [ 
      ascii[0] >> 2, 
      ((ascii[0] & 3) << 4) | ascii[1] >> 4, 
      ((ascii[1] & 15) << 2) | ascii[2] >> 6, 
      ascii[2] & 63 
     ]; 

tôi khá muốn biết những gì rất nhiều phương tiện này. Cụ thể là ">>", một ống đơn "|" và biểu tượng "&" trên dòng cuối cùng?

Được đánh giá cao!

+3

Toán tử nhị phân. – Pointy

+1

(-1) Tìm kiếm "nhà khai thác JavaScript" ... -1 vì đây là thông tin có sẵn * và * đã được tìm thấy quá phổ biến trên StackOverflow. –

+2

http://stackoverflow.com/questions/6194950/single-pipe-in-javascript, http://stackoverflow.com/questions/6997909/what-do-and-mean-in-javascript –

Trả lời

16

x >> y nghĩa để chuyển các bit của x bởi y nơi để bên phải (<< ở bên trái).

x | y nghĩa để so sánh các bit của xy, đặt một 1 trong mỗi bit nếu một trong hai x hoặc y1 ở vị trí đó.

x & y cũng giống như |, ngoại trừ kết quả là 1 nếu CẢ xy có một 1.

Ví dụ:

#left-shifting 1 by 4 bits yields 16 
1 << 4 = b00001 << 4 = b10000 = 16 

#right-shifting 72 by 3 bits yields 9 
72 >> 3 = b1001000 >> 3 = b1001 = 9 

#OR-ing 
8 | 2 = b1000 | b0010 = b1010 = 10 

#AND-ing 
6 & 3 = b110 & b011 = b010 = 2 

Để biết thêm thông tin, search Google for "bitwise operators".

+0

Chi tiết hơn một chút [ giải thích] (http://digitalfortress.tech/js/double-arrow-js-bitwise-operator/) trong trường hợp bạn vẫn không hoàn toàn thuyết phục. –

7

>> là sự dịch chuyển bit đúng. Phải mất các bit và thay đổi chúng ngay n địa điểm . Ví dụ: hãy xem xét 35 >> 2:

35 = 100011 shift two places 
    001000 = 8 

Và thực sự, 35 >> 2 == 8.


| là bitwise HOẶC. Phải mất mỗi bit trong mỗi toán hạng và ORs chúng lại với nhau. Bạn có thể hình dung nó như một loại bổ sung nhị phân, nhưng bạn không mang theo khi cả hai đầu và cuối là 1. Ví dụ, đây là 5 | 3:

5 = 101 
3 = 011 
| ----- 
    111 = 7 

Và quả thực, 5 | 3 == 7.


Cuối cùng, & là bitwise AND. Phải mất mỗi bit trong mỗi toán hạng, ngoại trừ thay vì cho 1 nếu một bit hoặc khác là một bit, nó cho 1 nếu một bit và khác là cả hai. Ví dụ: đây là 5 & 3:

5 = 101 
3 = 011 
& ----- 
    001 = 1 

Hãy dùng thử; 5 & 3 == 1.


Một số những người khác mà bạn có thể muốn phải nhận thức được là <<, đó là một sự thay đổi Bitwise trái, và ^, mà là một XOR (0 khi cả hai bit là như nhau, 1 nếu chúng khác nhau) .

Thực ra, nó là n modulo 32. 1 >> 321. Không chắc chắn lý do tại sao.

+1

Cảm ơn bạn đã có một câu trả lời hữu ích, không rành rành. – Ashe

+0

Đây phải là câu trả lời ngoại trừ! lời giải thích tuyệt vời – DoubleA

1
  • & (Bitwise AND)
  • | (Bitwise OR)
  • < < (Left shift)
  • >> (Sign-tuyên truyền dịch phải)

Ví dụ (từ https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators):

Bitwise và:

 9 (base 10) = 00000000000000000000000000001001 (base 2) 
    14 (base 10) = 00000000000000000000000000001110 (base 2) 
        -------------------------------- 
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10) 

Phím shift trái (9 < < 2 chuyển bit 9 trong dạng nhị phân, 2 bit sang trái):

 9 (base 10): 00000000000000000000000000001001 (base 2) 
        -------------------------------- 
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10) 
3

Các nhà khai thác >><< là một sự thay đổi bitwise. Ví dụ:

11 =  00001011 
11 << 3 = 01011000 = 88 

Điều đáng chú ý là m << n = m * 2^nm >> n = m/2^n. Điều này đôi khi được sử dụng để thực hiện phép nhân/chia rất hiệu quả theo quyền hạn của 2.

&| là bitwise và và hoặc tương ứng.

11 =  00001011 
28 =  00011100 
11 & 28 = 00001000 = 8 

11 =  00001011 
28 =  00011100 
11 | 28 = 00011111 = 31 

Trong khi tôi đang ở đó, tôi nên đề cập đến các ^ điều hành, mà không được sử dụng cho năng lượng, nhưng đối với Bitwise độc ​​quyền-hoặc.

11 =  00001011 
28 =  00011100 
11^28 = 00010111 = 23 
Các vấn đề liên quan