Wstęp
Jeśli ludzie liczą w systemie dziesiętnym, komputery liczą w systemie binarnym. Programista musi rozumieć, jak rozmawiać zarówno z ludźmi, jak i komputerami. Ta recenzja powinna pomóc w tej kwestii. Czasami za oczywistością kryje się cały świat. Proponuję porozmawiać o tym świecie. Na przykład tydzień ma 7 dni. A teraz odpowiedzmy sobie na pytanie: Jaka jest liczba „7”? ) Po pierwsze, jest to liczba całkowita (dodatnia) naturalna. Jest to również liczba dziesiętna.
Liczba dziesiętna to liczba w systemie dziesiętnym. Kiedy mówimy „dziesiętny system liczbowy”, oznacza to, że system liczbowy
ma podstawę 10 . Podstawa pokazuje, ile cyfr można użyć w danym systemie liczbowym do przedstawienia liczby. Odliczanie rozpoczyna się od zera. Odpowiednio do przedstawienia liczb w systemie dziesiętnym używamy liczb od 0 do 9. To dobrze, ale musimy liczyć nie tylko do 9, ale także dalej. Jak być? Na przykład liczba 10. Do zapisania tej liczby używamy aż 2 cyfr. Pozycja każdej cyfry w systemie dziesiętnym nazywana jest miejscem dziesiętnym. Cyfry liczone są od prawej do lewej:
Dodatkowo liczbę dziesiętną można rozwinąć w następujący sposób: 103 = 1*10^2 + 0*10^1 + 3*10^0
Liczba zasadniczo rośnie od prawej do lewej. Oznacza to, że na początku było to 7, a potem 10. Dlatego cyfry liczone są od prawej strony, zaczynając od zera. Po co to wszystko? Dzieje się tak dlatego, że nie jesteśmy komputerami. I chociaż liczymy w systemie dziesiętnym (czyli o podstawie 10), komputery liczą w systemie binarnym (czyli o podstawie 2). Ale zasady obowiązujące w tych systemach liczbowych są takie same.
System binarny
System binarny jest bardzo podobny do systemu dziesiętnego, z tą tylko różnicą, że limitem tutaj nie jest 10, ale 2. Porównajmy na przykładzie. Jak przedstawić liczbę 11 w systemie binarnym? To bardzo proste: wystarczy podzielić liczbę dziesiętną przez podstawę 2, czyli policzyć 11/2 w kolumnie. Przykład:
Lub oto przykład z WikiHow:
Co ciekawe, liczbę binarną możemy przedstawić w taki sam sposób, jak dziesiętnie: 111 binarnie = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Przykład konwersji z systemu binarnego na dziesiętny można zobaczyć w
kalkulatorze internetowym . Skoro mowa o tym, że zasady działania w systemach liczbowych są takie same, przyjrzyjmy się dodawaniu w systemie binarnym:
Jak widać, cyfry przekazujemy podczas dodawania w taki sam sposób, jak w systemie dziesiętnym. Analizę dodawania można zobaczyć na przykład tutaj:
Nawiasem mówiąc, okresowo pojawia się słowo „absolutorium”. I co to jest?
Miejsce to po prostu „element strukturalny” reprezentujący liczbę. Oznacza to, że liczba 10 składa się z dwóch cyfr: do zapisania tej liczby potrzebujemy 2 cyfr, 2 miejsc, 2 elementów. Ważne jest, abyśmy to zrozumieli, ponieważ
w systemie liczb binarnych cyfra to bit . Słowo Bit pochodzi od angielskiego
„cyfry binarnej” , czyli liczby binarnej. Może to być 0 lub 1. Ale tak jak czytamy liczby i słowa jako całość, a nie litera po literze, tak komputery nie czytają pojedynczo. Dla
minimalnej „fragmentu” przetwarzanej informacji w pamięci RAM (tzw. najmniejszej adresowalnej jednostki informacji)
odczytywany jest ciąg 8 bitów . Ponieważ jest ich 8, ten nazywany jest „oktetem”. A także - bardziej znane słowo
Byte . Aby zapamiętać oktet, możesz pamiętać, że słowo ośmiornica (osiem nóg) jest tłumaczone na angielski jako ośmiornica. Oznacza to, że tutaj jest dokładnie to samo „octo” w tytule:
Zastanówmy się, jaką maksymalną liczbę możemy przedstawić w postaci 8 bitów?
I tu pojawia się pytanie: co z liczbami ujemnymi? Aby to zrozumieć, porozmawiajmy o tym, jak bajty są reprezentowane w Javie
Java i bajt
Jak to się dzieje, że możemy używać liczb ujemnych w Javie? Robi się to prosto. W Javie bajty są podpisane. Najbardziej wysunięta na lewo cyfra/bit (zwana także „najbardziej znaczącym bitem”) stanowi swego rodzaju „znacznik”, który odpowiada na pytanie: „Czy ta liczba jest ujemna?” Jeśli odpowiedź brzmi tak, to znacznik ma wartość 1. W przeciwnym razie będzie to 0. Spójrzmy na przykład, jak zamienić liczbę 5 na liczbę ujemną 5:
Na podstawie tego obrazu można zrozumieć granice, w jakich mieści się wartość Byte:
Jasne jest również, że:
- jeśli dodamy jeden do 127, otrzymamy -128.
- jeśli odejmiemy jeden od -128, otrzymamy 127.
Zatem bajt w Javie może przyjmować wartość od -128 do 127. Jak pamiętamy, bajt jest oktetem. A maksymalna cyfra/najbardziej znaczący bit ma numer seryjny 7, ponieważ liczymy od zera. W tym przypadku łatwo zapamiętać, że bajt jest równy -2 do potęgi 7 (dolna granica) do 2 do potęgi 7 minus 1 (górna granica). Praca z samym typem danych jest prosta. W tym artykule używamy internetowego kompilatora Java „repl.it” jako „piaskownicy”. https://repl.it/languages/java. Na przykład uruchommy kod, który będzie reprezentował zmienną bajtową w postaci binarnej jako ciąg znaków:
class Main {
public static void main(String[] args) {
byte octet = 5;
String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
System.out.println(bin);
}
}
Praca z bajtami jest aktywnie wykorzystywana podczas pracy ze strumieniami we/wy. Więcej informacji można znaleźć w samouczku firmy Oracle: „
Strumienie we/wy ”. Ponadto w Javie możesz użyć specjalnego literału, aby określić wartość w bitach:
class Main {
public static void main(String[] args) {
byte data = 0b101;
System.out.println(data);
}
}
Manipulacja bitami
Dotykając bajtów i bitów, nie można nie wspomnieć o różnych manipulacjach bitowych. Prawdopodobnie najczęstszą operacją jest przesunięcie (przesunięcie bitowe lub przesunięcie bitowe). A wszystko dlatego, że ich wynik ma wyraźne korzyści praktyczne. Jakie jest zastosowanie? Przesunięcie w lewo o N pozycji jest równoznaczne z pomnożeniem liczby przez 2N. A przesunięcie w prawo jest podobne do tego samego dzielenia, zatem 5<<2 == 5*Math.pow(2,2) Aby zrozumieć, dlaczego tak jest, spójrzmy na ten przykład bardziej szczegółowo:
Bitowa negacja NOT (jednoargumentowa bitowa), która jest reprezentowana przez tyldę, odwraca bity. Jest zapisywany jako tylda, na przykład ~5.
public static void main(String[] args) {
System.out.println(~5);
System.out.println(~-5);
}
To po raz kolejny pokazuje, że gdy Java zmienia znak liczby, oprócz odwracania wartości bitów na samym końcu, wykonujemy +1. I bez tego, jak widzimy, zmienia się nasza liczba 5. Aby pozostała ta sama liczba, co przed zmianą znaku, musisz zrobić +1. Bitowe AND pozwala na pozostawienie dwóch różnych liczb o wartości 1 na trochę tylko wtedy, gdy wszystkie bity mają wartość jeden. Interesujące w tym może być to, że ma to pewne zalety aplikacyjne:
int x=4;
System.out.println((x&1) != 1);
Ten kod sprawdza liczbę x pod kątem parzystości. Spójrzmy na przykład:
Używając jednocześnie bitowego AND i bitowego OR, możesz używać masek:
public static void main(String[] args) {
byte optionA=0b0100;
byte optionB=0b0010;
byte optionC=0b0001;
byte value = (byte)(optionB | optionC);
if ((optionC & value) != 0b0000) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
Więcej szczegółów znajdziesz w części „
Opcje maskowania za pomocą operatorów bitowych w Javie ” . Manipulacja bitami to ciekawy temat, na który napisano osobne recenzje, artykuły i książki. I stąd zaczyna się długa droga do kryptografii. W ramach tej recenzji warto zrozumieć, dlaczego to działa i jak. Aby uzyskać więcej informacji na temat operacji bitowych, polecam przeczytać recenzję z tproger: „
O operacjach bitowych ”.
Typy pierwotne
Zatem bajt to oktet, czyli 8 bitów. Łatwo zapamiętać, że w Javie, przypadkowo, istnieje również 8 typów pierwotnych. Typ pierwotny to typ danych wbudowany w język programowania, czyli dostępny domyślnie. bajt to najmniejszy prymitywny typ danych pod względem zajmowanej pamięci, z którym może współpracować Java. Jak powiedzieliśmy wcześniej, bajt zajmuje 8 bitów. Dlatego najbardziej znaczącą cyfrą jest liczba 7. Bajt zawiera zatem wartości od -2 do potęgi 7 do 2 do potęgi 7 minus 1 wynik. Jakie inne typy pierwotne istnieją:
Jak widać z tabeli, typy danych pod względem ilości zajętych danych podwajają się. Oznacza to, że short = 2 * bajt i int = 2 * short. Właściwie łatwo to zapamiętać. Pamiętaj, że bajt = 8 bitów. Pamięta się także o tym, że nie może być mniej. W języku angielskim liczba całkowita nazywana jest liczbą całkowitą. Pierwotny typ z niego nazwano skrótem int. Istnieje zwykła liczba całkowita - int. Jest wersja krótka, krótka i wersja długa, długa. Odpowiednio int zajmuje 32 bity (4 bajty). Wersja krótka jest 2 razy mniejsza – 16 bitów (2 bajty), a wersja długa jest dwukrotnie większa, tj. 64 bity (8 bajtów). Zatem int może co najwyżej przechowywać liczbę około 2 miliardów i stu milionów. A długo można przechowywać maksymalnie około 9 biliardów (ładne słowo). Pamiętając stary dowcip o tym, jak początkujący programista myśli, że w kilobajcie jest 1000 bajtów, a programista kompletny wierzy, że w kilogramie jest 1024 gramy, możemy zrozumieć:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Nawiasem mówiąc, uważny czytelnik mógł zauważyć, że na zdjęciu jest tylko 7 typów. 8 typem pierwotnym jest wartość logiczna. boolean to logiczny typ danych, który ma tylko dwie wartości: true i false. Powstaje jednak pytanie – jaki to rozmiar? Specyfikacja wirtualnej maszyny Java i sekcja „
2.3.4. Typ boolowski ” odpowiedzą nam:
Oznacza to, że zwykła wartość logiczna przyjmie tę samą wartość, co liczba całkowita. Jeśli zadeklarujemy tablicę typu boolean, wówczas każdy element tablicy zajmie 1 bajt. To takie cuda :)
Wniosek
Sugeruję zapoznanie się z kilkoma dodatkowymi materiałami do utrwalenia:
#Wiaczesław
GO TO FULL VERSION