JavaRush /Blog Java /Random-PL /Java: bity i bajty
Viacheslav
Poziom 3

Java: bity i bajty

Opublikowano w grupie Random-PL
Java: bity i bajty - 1

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:
Java: bity i bajty - 2
Dodatkowo liczbę dziesiętną można rozwinąć w następujący sposób: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bity i bajty - 3
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.
Java: bity i bajty - 4

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:
Java: bity i bajty - 5
Lub oto przykład z WikiHow:
Java: bity i bajty - 6
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
Java: bity i bajty - 7
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:
Java: bity i bajty - 8
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:
Java: bity i bajty - 9
Zastanówmy się, jaką maksymalną liczbę możemy przedstawić w postaci 8 bitów?
Java: bity i bajty - 10
I tu pojawia się pytanie: co z liczbami ujemnymi? Aby to zrozumieć, porozmawiajmy o tym, jak bajty są reprezentowane w Javie
Java: bity i bajty - 11

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:
Java: bity i bajty - 12
Na podstawie tego obrazu można zrozumieć granice, w jakich mieści się wartość Byte:
Java: bity i bajty - 13
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);
  }
}
Java: bity i bajty - 14

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:
Java: bity i bajty - 15
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); //-6
 	System.out.println(~-5);//4
}
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:
Java: bity i bajty - 16
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);
    // Check for optionB
    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ą:
Java: bity i bajty - 17
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:
Java: bity i bajty - 18
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
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION