Próbujesz odpowiedzieć na jednoznaczne pytanie (co to jest CHAR_BIT) oraz na ukryte pytanie (jak to działa) w pierwotnym pytaniu.
char w języku C i C++ stanowi najmniejszą jednostkę pamięci programu C może zająć *
CHAR_BIT w języku C i C++ oznacza liczbę bitów w Char. Musi być zawsze co najmniej 8 ze względu na inne wymagania dotyczące typu char. W praktyce na wszystkich nowoczesnych komputerach ogólnego przeznaczenia wynosi dokładnie 8, ale niektóre systemy historyczne lub specjalistyczne mogą mieć wyższe wartości.
Java nie ma odpowiednika CHAR_BIT lub sizeof, nie ma potrzeby, ponieważ wszystkie pierwotne typy w Javie mają stały rozmiar, a wewnętrzna struktura obiektów jest nieprzejrzysta dla programisty. W przypadku tłumaczenia tego kodu na język Java można po prostu zastąpić "sizeof (int) * CHAR_BIT - 1" stałą wartością 31.
W tym konkretnym kodzie jest on używany do obliczania liczby bitów w int. Należy pamiętać, że w tym obliczeniu zakłada się, że typ int nie zawiera żadnych bitów dopełniających.
Zakładając, że twój kompilator zdecyduje się na przedłużenie znaku na przesunięciach bitowych podpisanych cyfr i zakładając, że twój system używa 2s uzupełnienia dla liczb ujemnych, oznacza to, że "MASKA" będzie wynosić 0 dla wartości dodatniej lub zerowej, a -1 dla wartości ujemnej wartość.
Aby zanegować dwójkę liczby dopełnień, musimy wykonać bitowe nie, a następnie dodać. Równoważnie możemy odjąć jeden, a następnie bitowo go negować.
Ponownie zakładając dwójkę reprezentacji dopełnienia -1 jest reprezentowane przez wszystkie, więc wykluczenie lub z -1 jest równoznaczne z negacją bitową.
Tak więc, gdy v jest zerem, liczba jest pozostawiona w spokoju, gdy v to jedna, która jest zanegowana.
Należy pamiętać, że podpisane przepełnienie w C i C++ jest niezdefiniowanym zachowaniem. Tak więc użycie tego ABS wykonania na najbardziej ujemnej wartości prowadzi do nieokreślonego zachowania. Można to naprawić poprzez dodanie rzutów tak, że końcowa linia programu jest oceniana w unsigned int.
* Co zwykle jest, ale nie jest tak samo jak najmniejsza jednostka pamięci, którą sprzęt może rozwiązać. Implementacja może potencjalnie łączyć wiele jednostek pamięci adresowanej sprzętowo w jedną jednostkę pamięci programowalnej lub podzielić jedną jednostkę pamięci adresowej na wiele jednostek pamięci programowalnej.
@ QuantumSoup Nie wiem, dlaczego pytasz, dlaczego chcesz robić hacki bitowe w Javie? Zrobiłbyś trochę hackowania w Javie, jeśli piszesz serwer gniazd w Javie i chcesz dekodować przychodzące pakiety udp przesyłające się w powietrzu z oprogramowania układowego, które wymaga nieco manipulacji. – JohnMerlino