Zakładasz, że 101 ma trzy bity. Java nie obsługuje operacji bitowych o zmiennej długości, działa na całym bitach, więc ~
będzie not
32-bitowego "101".
--- Edytowany po zapytaniu "Jak mogę to naprawić?" ---
To naprawdę dobre pytanie, ale odpowiedź brzmi: "nie możesz" i "możesz osiągnąć to samo na różne sposoby".
Nie można naprawić operatora ~
, tak jak robi to, co robi. Byłoby to jak prośba o naprawienie +
, aby dodać tylko miejsce 1. Po prostu nie nastąpi.
Możesz osiągnąć pożądaną operację, ale potrzebujesz trochę więcej "rzeczy", aby to osiągnąć. Najpierw musisz mieć coś (inny int), który określa interesujące bity . Nazywa się to zwykle maską bitową .
int mask = 0x00000007; // just the last 3 bits.
int masked_inverse = (~value) & mask;
Zauważ, że to co zrobiliśmy, odwróciło 32 bity, a następnie wyzerowało 29 z tych bitów; ponieważ zostały one ustawione na zero w masce, co oznacza "nie dbamy o nie". Można to sobie również wyobrazić jako działanie operatora &
tak, że mówimy "jeśli jest ustawione i zależy nam na tym, ustaw go".
Teraz będzie nadal ma 32 bity, ale tylko niższe 3 zostaną odwrócone. Jeśli potrzebujesz 3-bitowej struktury danych, to inna historia. Java (i większość języków) po prostu nie obsługuje takich rzeczy bezpośrednio. Można więc pokusić się o dodanie innego typu do Javy w celu obsługi tego. Java dodaje typy za pomocą mechanizmu klasy, ale typy wbudowane nie są zmienne. Oznacza to, że możesz napisać klasę reprezentującą 3-bitową strukturę danych, ale będzie ona musiała obsługiwać wewnętrznie jako pola 32-bitowe.
Na szczęście dla ciebie ktoś już to zrobił. Jest częścią standardowej biblioteki Java i 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);
Jednakże takie manipulacje bitowe mają różny dotyk do nich ze względu na ograniczenia systemu klasy/obiekt w Javie, co wynika z definiowania klas jak jedynym sposobem aby dodać nowe typy w Javie.
http: // en.wikipedia.org/wiki/Two's_complement –
Aby uzyskać szczegółowe informacje zobacz: http://stackoverflow.com/q/12337360/44522 – MicSim