Gần đây tôi đã thực hiện một khóa học Java (khóa học kéo dài 1 tuần), và chúng tôi đã trình bày một số toán học nhị phân.Nhà điều hành "~" đơn nhất - Chính xác những gì đang xảy ra ở đây?
này ~ điều hành unary (dấu ngã Tôi nghĩ rằng nó được gọi là?) Đã giải thích cho chúng tôi như sau:
Nó sẽ đảo ngược các mẫu bit biến mỗi "0" thành một "1" và mỗi "1" thành một " 0 ". ví dụ: Có 8 bit đến một byte. Nếu bạn có byte sau: 00000000 giá trị đảo ngược sẽ thay đổi thành 11111111.
Lời giải thích ở trên rõ ràng và súc tích và hoàn toàn hợp lý với tôi. Cho đến khi, đó là, tôi cố gắng thực hiện nó.
Với này:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
Đầu ra là:
-4
-6
Tôi rất bối rối về cách điều này xảy ra.
Nếu +3 ở dạng nhị phân là 11, thì nghịch đảo của số này sẽ là 00, điều này rõ ràng không phải là -3.
Nhưng vì có 8 bit trong một byte, thì không nên biểu diễn nhị phân của +3 được viết là 00000011?
Mà sẽ đảo ngược để trở thành 11111100. Chuyển đổi trở lại giá trị thập phân này sẽ là 252. Nếu bạn viết +3 là 011, thì nó thực sự chuyển thành 100, là +4, nhưng sau đó bạn biết đó là một số âm?
Làm thế nào về nếu bạn thử 0011, chuyển đổi thành 1100, nếu bạn sử dụng bit đầu tiên làm dấu, thì nó thực sự trở thành -4.
Ah - vì vậy tại thời điểm này tôi nghĩ rằng tôi đã nhận được một nơi nào đó.
Nhưng sau đó tôi đã nhận giá trị thứ hai của y = 5.
Làm cách nào để viết? Sử dụng cùng một logic, +5 chuyển đổi thành số nhị phân 0101, chuyển đổi thành 1010.
Và bây giờ tôi đang bối rối một cách khủng khiếp. Điều này có vẻ đại diện cho giá trị đã ký là -2 hoặc giá trị không dấu là 10 thập phân? Không ai trong số đó là -6 Tôi đang được in ra.
Một lần nữa, nếu tôi tăng chiều dài lên đến 8 chữ số của một byte, +5 là 00000101, ngược lại sẽ trở thành 11111010. Và tôi thực sự không thể tìm thấy cách để biến điều này thành -6.
Có ai ngoài kia hiểu điều này, vì tôi không biết điều gì đang xảy ra ở đây và càng nhiều số tôi in ra thì tôi càng bối rối.
Google dường như không đưa ra bất cứ điều gì nhiều về điều này - có lẽ nó không thích nhìn vào dấu hiệu điều hành ít .. :-(
Tất cả các loại số nguyên trong Java được * ký *. –
@MarkoTopolnik char là một loại số và không được ký. –
Sau khi tất cả các câu trả lời rất hữu ích liên quan đến nó là bổ sung của 2, tôi tìm thấy video này mà dường như để giải thích nó khá tốt. Cảm ơn tất cả những ai đã trả lời. http://www.youtube.com/watch?v=Hof95YlLQk0&NR=1&feature=endscreen –