Bạn giả định rằng 101 dài ba bit. Java không hỗ trợ các hoạt động bit có độ dài thay đổi, nó hoạt động trên toàn bộ các bit int
, vì vậy ~
sẽ là not
của một bit dài 32 bit "101".
--- Đã chỉnh sửa sau khi được hỏi "Làm cách nào để khắc phục sự cố này?" ---
Đó là câu hỏi thực sự hay, nhưng câu trả lời là sự kết hợp của "bạn không thể" và "bạn có thể đạt được điều tương tự bằng các phương tiện khác nhau".
Bạn không thể sửa chữa toán tử ~
, vì nó hoạt động như thế nào. Nó sẽ giống như yêu cầu sửa lỗi +
để chỉ thêm địa điểm của 1. Chỉ sẽ không xảy ra.
Bạn có thể đạt được thao tác mong muốn, nhưng bạn cần thêm một chút "công cụ" để làm cho nó hoạt động. Trước tiên, bạn phải có nội dung nào đó (một int khác) chỉ định các bit quan tâm. Điều này thường được gọi là mặt nạ bit bit.
int mask = 0x00000007; // just the last 3 bits.
int masked_inverse = (~value) & mask;
Lưu ý rằng những gì chúng tôi đã thực sự đảo ngược 32 bit, sau đó lấy ra 29 số bit đó; bởi vì, chúng được đặt thành 0 trong mặt nạ, có nghĩa là "chúng ta không quan tâm đến chúng". Điều này cũng có thể được tưởng tượng khi tận dụng toán tử &
để chúng tôi nói "nếu được đặt và chúng tôi quan tâm đến nó, hãy đặt".
Bây giờ, bạn sẽ vẫn còn có 32 bit, nhưng chỉ có 3 bit thấp hơn sẽ được đảo ngược. Nếu bạn muốn có cấu trúc dữ liệu 3 bit thì đó là một câu chuyện khác. Java (và hầu hết các ngôn ngữ) chỉ không hỗ trợ trực tiếp những thứ đó. Vì vậy, bạn có thể bị cám dỗ để thêm một loại khác loại vào Java để hỗ trợ điều đó. Java thêm các loại thông qua cơ chế lớp, nhưng các loại được cài sẵn không thể thay đổi. Điều này có nghĩa là bạn có thể viết một lớp để biểu diễn cấu trúc dữ liệu 3 bit, nhưng nó sẽ phải xử lý ints nội bộ dưới dạng các trường 32 bit.
May mắn thay cho bạn, ai đó đã thực hiện việc này. Nó là một phần của thư viện Java chuẩn và is called a BitSet
.
BitSet threeBits = new BitSet(3);
threeBits.set(2); // set bit index 2
threeBits.set(0); // set bit index 0
threeBits.flip(0,3);
Tuy nhiên, thao tác chút như có một cảm giác khác nhau cho họ do những hạn chế của hệ thống lớp/đối tượng trong Java, cho phép theo quy định lớp học như chỉ cách thêm các loại mới trong Java.
http: // en.wikipedia.org/wiki/Two's_complement –
Để biết chi tiết, hãy xem: http://stackoverflow.com/q/12337360/44522 – MicSim