2010-12-28 32 views
22

Tôi có sau:câu hỏi bitmask?

public static final int LIMIT_ONE = 1; 
public static final int TRADEABLE = (1 << 1); 
public static final int SELLABLE = (1 << 2); 
public static final int STORABLE = (1 << 3); 
public static final int STORABLE_IN_WH = (1 << 4); 
public static final int STORABLE_IN_LEGION_WH = (1 << 5); 
public static final int BREAKABLE = (1 << 6); 
public static final int SOUL_BOUND = (1 << 7); 
public static final int UNK9 = (1 << 8); 
public static final int UNK10 = (1 << 9); 
public static final int UNK11 = (1 << 10); 
public static final int CAN_COMPOSITE_WEAPON = (1 << 11); 
public static final int BLACK_CLOUD_TRADERS = (1 << 12); 
public static final int CAN_SPLIT = (1 << 13); 
public static final int UNK15 = (1 << 14); 
public static final int UNK16 = (1 << 15); 

và tôi muốn tìm hiểu làm thế nào nó được tính toán để đưa ra kết quả sau, ví dụ:

Tôi thực sự tránh khỏi thất bại về cách làm việc bitmask và nếu bất kỳ ai có lẽ có thể đưa ra một số lời khuyên và giải thích làm thế nào nó đi đến con số đó tôi sẽ đánh giá cao rất nhiều.

+0

Bạn có muốn biết những gì '<<' làm không? Tôi không hiểu câu hỏi. –

+0

@Nikita từ bộ trên tôi muốn hiểu cách nó tạo bitmap 12414 và cách hoàn nguyên lại. – Prix

Trả lời

20

Biểu thức (1 << n) tương đương với 2 được nâng lên lũy thừa n.

Khi bạn viết (1 << n) | (1 << m), số này giống với (1 << n) + (1 << m) miễn là nm là khác nhau. Vì vậy, bạn có thể nghĩ về nó trong điều khoản của bổ sung đơn giản nếu bạn muốn.

Số 12414 trong hệ nhị phân là 11000001111110 vì vậy nó là sum (hoặc bitwise OR) của lá cờ sau:

 
TRADEABLE    1 << 1 =  2 
SELLABLE     1 << 2 =  4 
STORABLE     1 << 3 =  8 
STORABLE_IN_WH   1 << 4 = 16 
STORABLE_IN_LEGION_WH 1 << 5 = 32 
BREAKABLE    1 << 6 = 64 
BLACK_CLOUD_TRADERS  1 << 12 = 4096 
CAN_SPLIT    1 << 13 = 8192 
======================================== 
         Total = 12414 

Lưu ý rằng những lá cờ được bao gồm tương ứng với các bit được thiết lập trong hệ nhị phân đại diện của 12414, khi đọc từ phải sang trái.

+1

Đúng, nhưng có thể anh ta đã hỏi làm thế nào để tìm những lá cờ được lưu trữ trong một số đã cho (ví dụ 12414) - anh ta đang tìm kiếm toán tử '&' imho. – Konerak

+0

Vì vậy, (1 << 1) sẽ dẫn đến 2? và (1 << n) + (1 << m) sẽ dẫn đến 14 trong đó n = 3 và m = 4? – Prix

+0

@Konerak yes Tôi muốn biết cách hoàn nguyên từ số đó. – Prix

0

Tôi không hiểu câu hỏi "cách tính toán để cung cấp kết quả theo dõi". (Điều gì được tính?)

Điều chính cần hiểu là tất cả giá trị máy tính được lưu trữ dưới dạng nhị phân. Bất kỳ số nào sẽ là kết hợp của 0 và 1 bit. Một số số chỉ có một bit.

http://en.wikipedia.org/wiki/Mask_(computing)

5

a << b thay đổi các bit trong ab giá trị sang bên trái, đệm các bit mới trên đúng với zero. 1 << n tương đương với một số nguyên chỉ với số bit n thứ (tính từ 0 từ bên phải), tương đương với 2 n.

12414 là 11000001111110 ở dạng nhị phân. Do đó nó được tạo ra bằng cách tổng hợp các hằng số được liệt kê dưới đây. Bạn có thể làm việc này bằng cách nhìn thấy bit 1 từ bên phải được thiết lập, do đó TRADEABLE là "set"; bit 7 không được thiết lập (nó là 0), do đó SOUL_BOUND không được "đặt". Lưu ý cách các số bit liên kết với các giá trị được khai báo là (1 << n).

TRADEABLE 
SELLABLE 
STORABLE 
STORABLE_IN_WH 
STORABLE_IN_LEGION_WH 
BREAKABLE 
BLACK_CLOUD_TRADERS 
CAN_SPLIT 
+0

++ Bạn đang nhanh chóng! Đánh tôi đi. –

0

Đoán của tôi là bạn lấy một số, ví dụ như ví dụ 12414 và tìm ra thuộc tính nào chứa trong đó.

Ví dụ, kể từ 12414 là 11000001111110 trong nhị phân, bất kỳ thứ gì được gắn vào đều có thể giao dịch được, vì ANDING số này với mặt nạ sẽ cung cấp cho bạn số 1 trong bit thứ hai.

0

Trong dạng nhị phân, 12414 là 11000001111110. LIMIT_ONE ở dạng nhị phân là 1 và < <, là toán tử bitshift di chuyển số 0 sang bên trái bằng 0 ở bên phải. Vì vậy, có thể giao dịch trong nhị phân là 10 và tiếp tục cho đến khi unk16, kết thúc lên là 1000000000000000. Bây giờ bạn đặt các giá trị này lại với nhau bằng bitwise OR, về cơ bản đặt 1 trên mỗi vị trí mà ít nhất một toán hạng của nó có một vị trí đó (toán tử đường ống '|' được sử dụng trong hầu hết các ngôn ngữ).

Ví dụ:

100 | 10 = 110 

Do đó, để có được 12.414, bạn cần phải làm một Bitwise OR trên các biến sau: unk16, unk15, giao dịch được, selleable, storeable, storeable trong wh, storeable trong wh legion và dễ vỡ. Sự kết hợp của các vị trí trên các vị trí khác nhau trong mỗi biến số này cung cấp cho bạn số nhị phân 11000001111110, biến thành số thập phân là 12414.

Đây có lẽ là cách đơn giản nhất để giải thích nó, nếu bạn muốn biết thêm, bạn nên đọc về các toán tử bitwise và cách biểu diễn nhị phân của các số hoạt động.

Để tìm ra cờ nào số 12414 có, bạn có thể sử dụng toán tử & (bitwise AND) và thực hiện kiểm tra bằng không. Ví dụ:

6 & 2 = 2 (110 has a 1 on the same position as 2, which is 010) 
6 & 1 = 0 (110 does not have a 1 on the same position as 1, which is 001) 
34

12414 trong binary là:

Binary number: 1 1 0 0 0 0 0 1 1 1 1 1 1 0 
------------------------------------------------------- 
Bit positions: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 

Nhìn vào mà bit là 1. Đó là những lá cờ được đặt trong bitmask, được tạo ra bằng cách sử dụng các phép toán tử OR để kết hợp những lá cờ:

bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT; 

để giải thích thêm này, STORABLE = (1 << 3); có nghĩa là có thể lưu trữ bằng số một (nhị phân 1, giảm chỉ ở vị trí bit 0) shi fted bên trái bởi 3 nơi. Lưu ý rằng STORABLE = Math.pow(2, 3); sẽ là tương đương. Vì không có các bit chồng lên nhau giữa các cờ, chúng ta có thể kết hợp tất cả chúng thành một int duy nhất và sau đó tách chúng ra sau.

Chúng tôi có thể kiểm tra sự tồn tại của lá cờ bằng cách sử dụng toán tử AND điều hành, mà sẽ trả về một khác không có giá trị nếu cờ được thiết lập và một giá trị zero nếu cờ không được thiết lập:

if(bitmask & TRADEABLE != 0) { 
    // This item can be traded 
} else { 
    // This item cannot be traded 
} 

Chúng tôi có thể đặt, xóa hoặc chuyển đổi cờ như thế này:

bitmask |= TRADEABLE; // Sets the flag using bitwise OR 
bitmask &= ~TRADEABLE; // Clears the flag using bitwise AND and NOT 
bitmask ^= TRADEABLE; // Toggles the flag using bitwise XOR 
+0

cảm ơn rất nhiều mà thực sự là một cách dễ dàng để xác minh nếu một bitmask có chứa một cái gì đó hay không! – Prix