Niedawno zrobiłem kurs języka Java (1 tydzień kursu zderzeniowego) i omówiliśmy niektóre matematykę binarną.Unary "~" operator - Co dokładnie się tutaj dzieje?
to jednoskładnikowa Operator ~ (tylda myślę, że to się nazywa?) Zostało wyjaśnione do nas tak:
To odwraca wzór bitowy obracając każde „0” na „1” i każdy „1” w " 0 ". np. Jest 8 bitów do bajtu. Jeśli masz następujący bajt: 00000000, odwrócona wartość zmieni się na 11111111.
Powyższe wyjaśnienie jest jasne i zwięzłe i całkowicie ma dla mnie sens. Dopóki to nie nastąpi, staram się to wdrożyć.
Biorąc pod uwagę to:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
Wyjście jest:
-4
-6
Jestem bardzo mylić o tym, jak to się dzieje.
Jeśli +3 w binarnym to 11, to odwrócenie tego będzie wynosić 00, co oczywiście nie jest -3.
Ale ponieważ w bajcie jest 8 bitów, to czy binarna reprezentacja +3 nie powinna być zapisana jako 00000011?
Który odwróciłby się do 11111100. Przeliczony z powrotem na wartość dziesiętną byłby to 252. Jeśli jednak napiszesz +3 jako 011, to faktycznie konwertuje się na 100, czyli +4, ale jak Ty to robisz? wiesz, że to liczba ujemna?
Co powiesz, jeśli spróbujesz 0011, który przekształci się na 1100, a jeśli użyjesz pierwszego bitu jako znaku, to rzeczywiście stanie się -4.
Ah - więc w tym momencie myślałem, że gdzieś zmierzam.
Ale potem dostał się do drugiej wartości y = 5.
Jak napisać to? Używając tej samej logiki, +5 konwertuje na binarny 0101, który odwraca się do 1010.
I już teraz jestem okropnie zdezorientowany. Wygląda na to, że reprezentuje to wartość -2 lub niepodpisaną wartość dziesiętną +10? Żadne z nich nie jest drukowane -6.
Znowu, jeśli zwiększam długość do 8 cyfr bajtów, +5 to 00000101, który odwrócony staje się 11111010. I naprawdę nie mogę znaleźć sposobu, aby zmienić to na -6.
Czy ktoś tam to rozumie, ponieważ nie mam pojęcia, co się tutaj dzieje i im więcej numerów wydrukuję, tym bardziej jestem zdezorientowany.
Google nie wydaje się, aby wymyślić coś dużo na ten temat - może to nie podoba, patrząc na małe znaki operatora .. :-(
Wszystkie wbudowane typy numeryczne w języku Java są * podpisane *. –
@MarkoTopolnik char jest typem liczbowym i nie jest podpisany. –
Po tych wszystkich bardzo pomocnych odpowiedziach dotyczących tego, czy jest to dopełnienie dwójki, znalazłem to wideo, które wydaje się wyjaśniać je całkiem dobrze. Dziękuję wszystkim, którzy odpowiedzieli. http://www.youtube.com/watch?v=Hof95YlLQk0&NR=1&feature=endscreen –