2009-09-17 15 views

Trả lời

124

Để có được một mặt nạ bit:

var mask = 1 << 5; // gets the 6th bit 

Để kiểm tra xem một chút được thiết lập:

if ((n & mask) != 0) { 
    // bit is set 
} else { 
    // bit is not set 
} 

Để thiết lập một chút:

n |= mask; 

Để xóa một chút:

n &= ~mask; 

Để chuyển đổi một chút:

n ^= mask; 

Tham khảo Javascript bitwise operators.

19

Tôi muốn thêm một số điều (với nhờ @cletus)

function bit_test(num, bit){ 
    return ((num>>bit) % 2 != 0) 
} 

function bit_set(num, bit){ 
    return num | 1<<bit; 
} 

function bit_clear(num, bit){ 
    return num & ~(1<<bit); 
} 

function bit_toggle(num, bit){ 
    return bit_test(num, bit) ? bit_clear(num, bit) : bit_set(num, bit); 
} 
+1

Điều này thật tuyệt vời. Bạn có thể giải thích tại sao bit_test hoạt động? Tôi hiểu sự thay đổi đúng để di chuyển bit thú vị đến vị trí ngoài cùng bên phải, nhưng tôi bị lạc cố gắng hiểu giá trị trung gian là gì và tại sao phần còn lại của nó khi chia cho 2 là không khác khi được đặt. – Raoul

+1

Sau khi bạn nhận được bit mong muốn ở vị trí ngoài cùng bên phải, bạn chỉ cần kiểm tra xem giá trị mới có bị giảm hay không (new_value% 2! = 0). Một số suy giảm sẽ có bit0 = 1 hoặc else bit0 = 0 (vì bit0 là 2 để cấp 0 là 1) – UnLoCo

0

tôi đã xây dựng một lớp BitSet với sự giúp đỡ của thông tin @cletus:

function BitSet() { 
    this.n = 0; 
} 

BitSet.prototype.set = function(p) { 
    this.n |= (1 << p); 
} 

BitSet.prototype.test = function(p) { 
    return (this.n & (1 << p)) !== 0; 
} 

BitSet.prototype.clear = function(p) { 
    this.n &= ~(1 << p); 
} 

BitSet.prototype.toggle = function(p) { 
    this.n ^= (1 << p); 
} 
Các vấn đề liên quan