2013-03-24 30 views
10

Tôi đã xem một kịch bản thú vị, Khi làm việc với toán tử thay đổi bit. Nếu toán hạng thứ hai là số âm, thao tác dịch chuyển bitwise hoạt động như thế nào? .Toán tử thay đổi khôn ngoan với sự dịch chuyển theo số âm

có nghĩa là < < b, "< <" thay đổi mẫu bit sang trái bằng bit b trong a. Nhưng nếu b là neagtive, nó không phải là một lỗi trong thời gian chạy?

Tôi có thể chạy mã bên dưới thành công nhưng tôi không hiểu nó hoạt động như thế nào?

public static void bitwiseleftShift(char testChar) 
{ 
    int val=testChar-'a'; 
    int result= 1<<val; 
    System.out.println("bit wise shift of 1 with val="+val+" is "+result); 
} 

Input

bitwiseleftShift('A');// ASCII 65 
    bitwiseleftShift('0'); // ASCII 48 

Kết quả

bit wise shift of 1 with val=-32 is 1 
    bit wise shift of 1 with val=-49 is 32768 

ASCII cho 'a' là 97. Ai đó có thể giúp tôi hiểu được cách làm việc này?

Trả lời

9

Nhưng nếu b là không hoạt động, có phải là lỗi khi chạy không?

Không theo ngôn ngữ Java Specification, section 15.19:

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 là khoảng cách dịch chuyển. 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.

Vì vậy, một sự thay đổi của -32 thực sự kết thúc như một sự thay đổi từ 0, và một sự thay đổi của -49 thực sự kết thúc như một sự thay đổi từ 15 - do đó kết quả mà bạn thấy.

+0

Cảm ơn John! Điều đó trả lời nó .. SO nói rằng tôi không thể chấp nhận câu trả lời cho đến khi thêm 6 phút ... :(Nhân tiện, fan hâm mộ lớn! – prashantsunkari

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