2009-12-01 30 views
10

Đây là đoạn trích từ tập lệnh mã hóa JS mà tôi đang nghiên cứu.Các ký tự không quen thuộc được sử dụng trong tập lệnh mã hóa JavaScript

function permutationGenerator(nNumElements) { 
    this.nNumElements  = nNumElements; 
    this.antranspositions = new Array; 
    var k = 0; 
    for (i = 0; i < nNumElements - 1; i++) 
    for (j = i + 1; j < nNumElements; j++) 
    this.antranspositions[ k++ ] = (i << 8) | j; 
    // keep two positions as lo and hi byte! 
    this.nNumtranspositions = k; 
    this.fromCycle = permutationGenerator_fromCycle; 
} 

bất cứ ai có thể giải thích việc sử dụng các đôi dưới dấu hiệu < <, cũng như các đường ống đơn | ?

Sau đó, trong tập lệnh lớn hơn hai dấu hiệu cũng xuất hiện >>, cũng có một dấu và &.

function permutationGenerator_fromCycle(anCycle) { 
    var anpermutation = new Array(this.nNumElements); 
    for (var i = 0; i < this.nNumElements; i++) anpermutation[i] = i; 
    for (var i = 0; i < anCycle.length; i++) { 
     var nT = this.antranspositions[anCycle[i]]; 
     var n1 = nT & 255; 
     var n2 = (nT >> 8) & 255; // JC 
     nT = anpermutation[n1]; 
     anpermutation[n1] = anpermutation[n2]; 
     anpermutation[n2] = nT; 
    } 
    return anpermutation; 
} 

Tôi quen thuộc với đơn < hoặc> và tất nhiên logic & & và logic || .

Suy nghĩ?

Trả lời

14

Dịch chuyển trái 8 bit và bitwise OR bằng j.

<< là toán tử dịch trái. Thay đổi các bit trong biến còn lại số vị trí được chỉ định.

>> là toán tử dịch chuyển đúng. Thay đổi các bit trong biến phải số vị trí được chỉ định.

| là toán tử OR bitwise. Thực hiện một OR hợp lý trên mỗi bit trong hai toán hạng.

& là toán tử bitwise AND. Thực hiện một logic AND trên mỗi bit trong hai toán hạng.

8

< < là sự dịch chuyển trái ngược bit. >> là một sự thay đổi đúng đắn. | là OR một chút. & là bitwise AND. Vui lòng xem this reference để biết thêm thông tin.

12

| = Bitwise hoặc

1010 
0100 
---- 
1110 

& = Bitwise và

1011 
0110 
---- 
0010 

do đó, nó giống như & & và || chỉ với các bit đơn

< < là dịch trái, vì vậy

< 2 thay đổi các con số lại bởi hai vị trí, năng suất 011.000 một cách khác để nghĩ về điều này là nhân bởi hai, vì vậy x < < 1 == x * 2, x < < 2 == x * 2 * 2 và như vậy, do đó, nó x * Math.pow (2, n) cho x <
>> 

thì ngược lại, vì vậy 0110> > 2 ---> 0001 bạn có thể nghĩ nó như là phân chia bởi hai, NHƯNG với việc làm tròn xuống, vì vậy nó bằng

Math.floor(x/Math.pow(2,n)) 
+0

Bạn có thể muốn làm rõ rằng '2^n' có nghĩa là" 2 được nâng lên n quyền ", chứ không phải" 2 XOR n ". –

+0

cảm ơn cho nhận xét, thậm chí không nghĩ về điều đó. đổi nó thành Math.pow (...) để làm cho nó rõ ràng hơn – Zenon

+1

Đây là một chủ đề cũ, nhưng một * rất * hữu ích câu trả lời. Cảm ơn! – SwankyLegg

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