2011-08-09 51 views
10

Tôi có một số di truyền mã và không thể tìm ra một mảnh của nó:Cần giúp đỡ tìm hiểu cách sử dụng các toán tử Bitwise

byte[] b = new byte[4] { 3, 2, 5, 7 }; 
int c = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3]; 

bất cứ ai có thể cho những gì đang xảy ra ở đây? Cảm ơn!

+0

Bạn muốn cho chúng ta một bối cảnh rất ít về nơi bạn tìm thấy mã này? Hay đây chỉ là một thử nghiệm? – Nix

+0

@Nix là nơi anh ấy nhận nó thực sự có liên quan? – MGZero

+0

@MGZero hiện đã được trả lời là không .. – Nix

Trả lời

20

Về cơ bản, nó chuyển đổi 31 bit dưới của mảng 4 byte thành số nguyên sử dụng big-endian conversion.

Vì vậy, mảng byte của {0, 0, 0, 1} sẽ được chuyển thành 1; một mảng byte của {0, 0, 1, 0} sẽ được chuyển đổi sang 256, vv

Nó thực hiện điều này thông qua một hỗn hợp của các nhà khai thác Bitwise:

+0

Mọi thông tin chi tiết về điều này? Liên kết, vv Tôi sẽ đánh giá cao điều đó. – Kizz

+0

@Kizz: Tôi vừa chỉnh sửa với các liên kết cho mỗi nhà điều hành. Bạn cần gì nữa? –

+0

@Jon: Cảm ơn bạn! – MTG

5

đã không thực hiện chút toán học trong một phút so..for vui vẻ:
[thêm dấu ngoặc đơn để hiển thị thứ tự của ops]

((b[0] & 0x7f) << 24) | (b[1] << 16) | (b[2] << 8) | b[3] 

(b[0] & 0x7f) << 24 = 11 0000 0000 0000 0000 0000 0000 
b[1] << 16 = . . . . . . . . . . 10 0000 0000 0000 0000 
b[2] << 8 = . . . . . . . . . . . . . . . 101 0000 0000 
b[3] = . . . . . . . . . . . . . . . 0111 

tại HOẶC này lại với nhau, và bạn sẽ có được

0011 0000 0010 0000 0101 0000 0111 = 50,464,007 
Các vấn đề liên quan