2016-03-30 16 views
13

Ai đó có thể giải thích tại sao các biểu thức Bitwise sau trả lại kết quả khác nhau:Java hành Bitwise <<

System.out.println((-1<<31)<<1); // it prints 0 
System.out.println(-1<<32);  // it prints -1 
+1

Cũng http://stackoverflow.com/q/34193787/1743880 và http: // stackoverflow.com/q/3170412/1743880 – Tunaki

+0

@Tunaki: Vâng, nó tương tự. – nenito

Trả lời

14

-1<<32 tương đương với -1<<0, tức là không-op. Nguyên nhân là do sự thay đổi khoảng cách (32) là AND-ed với 0x1f32 & 0x1f là 0.

này được định nghĩa trong (tôi nhấn mạnh) JLS #15.19:

Nếu kiểu thúc đẩy của toán hạng bên trái là int, sau đó chỉ năm bit bậc thấp nhất của toán hạng bên phải được sử dụng làm khoảng cách shift. Nó giống như toán hạng bên phải đã phải chịu một toán tử AND logic logic & (§15.22.1) với giá trị mặt nạ 0x1f (0b11111). Khoảng cách dịch chuyển thực sự được sử dụng do đó luôn nằm trong khoảng từ 0 đến 31, bao gồm.

3

Giá trị đếm thay đổi được sử dụng modulo 32. Vì vậy, ví dụ thứ hai là thực sự giống như chuyển bằng 0.

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