thể trùng lặp:
why is 1>>32 == 1?Tại sao (-1 >>> 32) = -1?
-1 như một int chuyển đổi sang nhị phân được biểu diễn bởi 32 1. Khi tôi dịch phải 31 lần, tôi nhận được 1 (31 0 và 1). Nhưng khi tôi đổi nó 32 lần, tôi lại nhận được -1. Không được bằng 0?
thể trùng lặp:
why is 1>>32 == 1?Tại sao (-1 >>> 32) = -1?
-1 như một int chuyển đổi sang nhị phân được biểu diễn bởi 32 1. Khi tôi dịch phải 31 lần, tôi nhận được 1 (31 0 và 1). Nhưng khi tôi đổi nó 32 lần, tôi lại nhận được -1. Không được bằng 0?
Các đặc điểm kỹ thuật Java giải thích shift operators như sau:
Nếu kiểu thúc đẩy của toán hạng bên trái là
int
, chỉ có năm bit bậc thấp nhất của toán hạng bên phải được sử dụng như sự thay đổi khoảng cách. 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
. 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.
Giá trị 32 & 0x1f
bằng không.
Nếu toán hạng bên trái là long
, sau đó bạn nhận được một chút thêm cho toán hạng bên phải, mở rộng giới hạn trên 63 thay vì 31.
Để có bất kỳ giá trị kỳ vọng cụ thể từ các thay đổi - 1 ở bên phải, bạn cần xác định biểu diễn nhị phân cơ bản của các số nguyên (ví dụ, bổ sung của hai) cũng như số bit (ví dụ 32). Mỗi ngôn ngữ lập trình có thể xác định những thứ khác nhau, nhưng vì lợi ích của việc giữ mọi thứ đơn giản hơn cho việc triển khai, chúng thường chỉ định rằng việc dịch chuyển nhiều hơn số bit có sẵn không được phép. Điều đó thường là do phần cứng CPU bên dưới không hỗ trợ nó. Sau khi tất cả, nếu bạn muốn thay đổi nhiều bit, toán hạng bên trái không còn quan trọng vì kết quả sẽ luôn giống nhau.
Cảm ơn bạn, điều đó có ý nghĩa. – user183037
BTW nó có nghĩa là bạn có thể nhận được bit đầu của 'x' bằng cách sử dụng' x >> 63' hoặc 'x >> -1' cho dù x là int hay dài. ;) –
Dịch chuyển cũng có thể phụ thuộc vào hệ thống 32/64 bit. – TheCottonSilk
Dường như Java. Tôi không biết nhiều ngôn ngữ xác định toán tử '>>>'. – leppie
Tôi đã xem qua điều này trong khi tôi đã cố gắng tìm hiểu những điều cơ bản của Java, có, nhưng tôi đã không gắn thẻ nó vì vậy tôi cho rằng chuyển dịch bit là một khái niệm khá chung chung. – user183037
kiểm tra: http://stackoverflow.com/questions/3170412/why-is-132-1 –