Porozmawiajmy o operacjach w Javie: numerycznych, logicznych, bitowych. Jest to podstawa teoretyczna, która na pewno jest potrzebna, aby nauczyć się programować.
Tabela 1. Binarne operatory arytmetyczne
Pierwsze cztery operatory nie powinny rodzić żadnych pytań: wszystko jest tak samo jak w matematyce. Ostatni operator, reszta dzielenia, również nie robi nic zbyt skomplikowanego. Na przykład, jeśli podzielimy 24 przez 7, otrzymamy 3 liczby całkowite i 3 resztę. Pozostałą część zwróci ten operator:
Oprócz operatorów binarnych Java ma jednoargumentowe operatory arytmetyczne.
Tabela 2. Jednoargumentowe operatory arytmetyczne:
Przykład jednoargumentowego plusa i minusa:
Operacje zwiększania i zmniejszania są zasadniczo proste. W pierwszym przypadku zmienna jest zwiększana o 1, w drugim zmienna jest zmniejszana o 1. Przykład poniżej:
Tabela 3. Operatory zwiększania i zmniejszania:
Demonstracja:
Oprócz arytmetyki istnieją operacje porównania (dwóch liczb). Wynik zawsze będzie prawdziwy lub fałszywy ( prawda / fałsz ).
Tabela 4. Operatory porównania
Przykłady:
Tabela 5. Tabela prawdy operatora negacji (NIE)
Tabela 6. Tablica prawdy operatora koniunkcji (AND)
Tabela 7. Tablica prawdy operatora alternatywy (OR)
Tabela 8. Tabela prawdy operatora dodawania modulo (XOR)
Java ma te same operacje logiczne:
I do
Teraz mamy operatory skrócone (
Czasami wynik wyrażenia można obliczyć na podstawie pierwszego operandu. To właśnie odróżnia operatory skrócone
W przypadku operatorów skróconych druga część wyrażenia nie jest oceniana. Dzieje się tak jednak tylko wtedy, gdy wynik wyrażenia jest już oczywisty od pierwszego operandu.
Zademonstrujmy liczenie od 0 do 15 w systemie dziesiętnym i binarnym:
Jak widać, wszystko nie jest takie skomplikowane. Oprócz bitów istnieją inne znane jednostki informacji - bajty , kilobajty , megabajty , gigabajty itp. Prawdopodobnie wiesz, że w 1 bajcie jest 8 bitów . Co to znaczy? Oznacza to, że 8 bitów z rzędu zajmuje 1 bajt. Oto przykłady, jakie mogą być bajty:
Voila – to nie jest takie skomplikowane. Ale nadal trzeba coś wyjaśnić.
Spójrzmy na to na przykładzie liczby 8-bitowej:
Podejście jest proste i w zasadzie zrozumiałe. Ma jednak wady: trudności w wykonywaniu operacji matematycznych. Na przykład po dodaniu liczb ujemnych i dodatnich. Nie można ich złożyć, chyba że zostaną przeprowadzone dodatkowe manipulacje.
W pierwszym wierszu otrzymaliśmy wartość w systemie binarnym bez zer wiodących. Choć ich nie widzimy, oni tam są. Świadczy o tym druga linia, w której wszystkie bity zostały zamienione na odwrotne. Dlatego właśnie widzimy tak wiele wiodących jednostek. Są to dawne zera wiodące, które zostały zignorowane przez kompilator po wydrukowaniu w pierwszym wierszu. Oto mały program, który dla przejrzystości wyświetla również zera na początku.
Teraz. Co możesz powiedzieć o liczbach przesuniętych w prawo? Są podzielne przez 2. Za każdym razem, gdy przesuniemy się o jeden bit w prawo, dzielimy pierwotną liczbę przez 2. Jeśli liczba nie jest podzielna przez 2, wynik zostanie zaokrąglony w stronę minus nieskończoności (w dół). Ale to działa tylko wtedy, gdy przesuniemy bity dokładnie o 1. A jeśli o 2 bity, podzielimy przez 4. Przez 3 bity podzielimy przez 8. Przez 4 bity podzielimy przez 16. Widzisz? Potęgi liczby 2... Gdy przesuwamy liczbę
- Jakie są typy operatorów w Javie?
- Operatorzy Java w kursie JavaRush
- Operacje na liczbach w Javie
- Operacje logiczne w Javie
- Operacje bitowe w Javie
- Pierwszeństwo operacji w Javie
- Przydatne przykłady użycia
Jakie są typy operatorów w Javie?
Do każdej operacji potrzebujemy co najmniej dwóch rzeczy:- operator;
- operand.
Operatorzy Java w kursie JavaRush
Kilka wykładów poświęconych jest operatorom Java na czwartym poziomie pierwszego zadania - Składnia Java. W szczególności operatory warunkowe, takie jak boolean . Kurs zawiera 22 zadania, które pomogą Ci zrozumieć działanie operatorów porównania, operatorów warunkowych i operatorów logicznych.Operacje na liczbach w Javie
Najczęstszą operacją wykonywaną przez programistów na liczbach jest przypisanie wartości liczbowej do zmiennej. Ona, podobnie jak operator,=
jest ci znana:
int a = 1;
int b = 2;
int c = 3;
Istnieją również operacje arytmetyczne. Wykonuje się je za pomocą binarnych operatorów arytmetycznych:
System.out.println(24 % 7); // drukuje 3
Oto przykłady z oficjalnej strony dokumentacji Oracle: Ten program wyświetli następujące dane: 1 + 2 = 3 3 - 1 = 2 2 * 2 = 4 4 / 2 = 2 2 + 8 = 10 10 % 7 = 3 Java pozwala łączyć: na przykład przypisania operatorów i operatory arytmetyczne. Spójrzmy na przykład:
int x = 0;
x = x + 1; // x = 0 + 1 => x = 1
x = x + 1; // x = 1 + 1 => x = 2
x = x + 1; // x = 2 + 1 => x = 3
Tutaj zdefiniowaliśmy zmienną x
i przypisaliśmy jej wartość zero. Następnie w każdej linii przypisujemy wartość x
będącą sumą aktualnej wartości zmiennej x
i jedynki. W komentarzach do każdej linijki znajdują się wyjaśnienia. Ta procedura nazywa się zwiększaniem lub zwiększaniem zmiennej. Operację inkrementacyjną z powyższego przykładu można zastąpić podobną, wykorzystując kombinację operatorów:
int x = 0;
x += 1; // x = 0 + 1 => x = 1
x += 1; // x = 1 + 1 => x = 2
x += 1; // x = 2 + 1 => x = 3
Operator przypisania można połączyć z dowolnym operatorem arytmetycznym:
int x = 0;
x += 10; // x = 0 + 10 => x = 10
x -= 5; // x = 10 - 5 => x = 5
x *= 5; // x = 5 * 5 => x = 25
x /= 5; // x = 25 / 5 => x = 5
x %= 3; // x = 5 % 3 => x = 2;
Pokażmy, jak działa ostatni przykład:
int x = 0;
x = (+5) + (+15); // Nawiasy dla jasności, da się bez nich
System.out.println("x = " + x);
int y = -x;
System.out.println("y = " + y);
int x = 9;
x++;
System.out.println(x); // 10
int y = 21;
y--;
System.out.println(y); // 20
Istnieją dwa rodzaje tych operacji - postfiks i prefiks. W pierwszym przypadku operator zapisywany jest po zmiennej, w drugim przypadku przed zmienną. Jedyna różnica polega na tym, kiedy wykonywana jest operacja zwiększania lub zmniejszania. Przykład i opis w tabeli poniżej. Powiedzmy, że mamy zmienną:
int a = 2;
Następnie:
int a = 1;
int b = 2;
boolean comparisonResult = a == b;
System.out.println("a == b :" + comparisonResult);
comparisonResult = a != b;
System.out.println("a != b :" + comparisonResult);
comparisonResult = a > b;
System.out.println("a > b :" + comparisonResult);
comparisonResult = a >= b;
System.out.println("a >= b :" + comparisonResult);
comparisonResult = a < b;
System.out.println("a < b :" + comparisonResult);
comparisonResult = a <= b;
System.out.println("a <= b :" + comparisonResult);
Demonstracja:
Operacje logiczne w Javie
Spójrzmy na operacje logiczne i tablice prawdy każdego z nich:- operacja negacji (
NOT
); - operacja koniunkcji, logiczne AND (
AND
); - operacja rozłączenia, logiczne OR (
OR
); - operacja dodawania modulo, wyłączne LUB (
XOR
).
!
— operator negacji;&&
— operator logiczny AND (krótki);||
— logiczny operator OR (krótki);&
— bitowy operator AND;|
— bitowy operator OR;^
— bitowy wyłączny operator OR.
public class LogicDemo {
public static void main(String[] args) {
notExample();
andExample();
orExample();
xorExample();
}
public static void notExample() {
System.out.println("NOT EXAMPLE:");
System.out.println("NOT false = " + !false);
System.out.println("NOT true = " + !true);
System.out.println();
}
public static void andExample() {
System.out.println("AND EXAMPLE:");
System.out.println("false AND false = " + (false & false));
System.out.println("false AND true = " + (false & true));
System.out.println("true AND false = " + (true & false));
System.out.println("true AND true = " + (true & true));
System.out.println();
}
public static void orExample() {
System.out.println("OR EXAMPLE:");
System.out.println("false OR false = " + (false | false));
System.out.println("false OR true = " + (false | true));
System.out.println("true OR false = " + (true | false));
System.out.println("true OR true = " + (true | true));
System.out.println();
}
public static void xorExample() {
System.out.println("XOR EXAMPLE:");
System.out.println("false XOR false = " + (false ^ false));
System.out.println("false XOR true = " + (false ^ true));
System.out.println("true XOR false = " + (true ^ false));
System.out.println("true XOR true = " + (true ^ true));
System.out.println();
}
}
Ten program wyświetli: NIE PRZYKŁAD: NIE fałsz = prawda NIE prawda = fałsz ORAZ PRZYKŁAD: fałsz I fałsz = fałsz fałsz ORAZ prawda = fałsz prawda I fałsz = fałsz prawda I prawda = prawda LUB PRZYKŁAD: fałsz LUB fałsz = fałsz fałsz LUB prawda = prawda prawda OR fałsz = prawda prawda LUB prawda = prawda PRZYKŁAD XOR: fałsz XOR fałsz = fałsz fałsz XOR prawda = prawda prawda XOR fałsz = prawda prawda XOR prawda = fałsz Operatory logiczne mają zastosowanie tylko do boolean
zmiennych. W naszym przypadku zastosowaliśmy je bezpośrednio do wartości, ale można ich również używać ze boolean
zmiennymi:
boolean
wyrażeń:
&&
, ||
) i podobne operatory bitowe ( &
, |
). Jaka jest różnica między nimi? Po pierwsze, bitowe można zastosować do liczb całkowitych. Porozmawiamy o tym nieco później. Po drugie, niektóre są skracane, a inne nie. Aby zrozumieć, jak wygląda skrót, spójrzmy na wyrażenie:
false AND x = ?
true OR x = ?
Może x
to przyjąć dowolną wartość logiczną. I w ogóle, zgodnie z prawami logiki i tablicami prawdy, niezależnie od tego, czy jest to x
prawda , czy fałsz , wynik pierwszego wyrażenia będzie fałszywy , a wynik drugiego będzie prawdziwy . Patrzeć.
&&
i ||
. W wyrażeniach podobnych do opisanych powyżej nie oceniają wartości drugiego operandu. Oto mały przykład:
Operacje bitowe w Javie
Cóż, tutaj dochodzimy do najciekawszej części: operacji bitowych. Jak sama nazwa wskazuje, są to operacje wykonywane na bitach. Zanim jednak zagłębimy się w ten temat, warto porozmawiać o obszarach pokrewnych.Reprezentacja liczb w systemie liczb binarnych
Liczby, jak każda inna informacja w programie, są przechowywane w pamięci komputera w kodzie binarnym. Kod binarny to zbiór zer i jedynek. Każde zero lub jeden reprezentuje jednostkę informacji zwaną bitem.Według Wikipedii:
Bit (od angielskiego cyfra binarna - liczba binarna; także gra słów: angielski bit - kawałek, cząsteczka) to jednostka miary ilości informacji. 1 bit informacji to symbol lub sygnał, który może przybierać dwa znaczenia: włączony lub wyłączony, tak lub nie, wysoki lub niski, naładowany lub nienaładowany; w systemie binarnym jest to 1 (jeden) lub 0 (zero).Z jakimi danymi pracują operatory bitowe?
Operacje bitowe w Javie są wykonywane tylko na liczbach całkowitych. Liczby całkowite są przechowywane w pamięci komputera jako zbiór bitów. Można powiedzieć, że komputer przetwarza dowolną informację na system liczb binarnych (zestaw bitów) i dopiero wtedy z nią wchodzi w interakcję. Ale jak działa system liczb binarnych? W systemie dziesiętnym mamy tylko 10 symboli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Tych symboli używamy do liczenia. Po 9 przychodzi 10, po 19 - 20, po 99 - 100, po 749 - 750. Oznacza to, że używamy kombinacji dostępnych 10 symboli i możemy ich używać do liczenia „od zera do obiadu”. W systemie binarnym zamiast dziesięciu symboli są tylko dwa - 0, 1. Ale łącząc te symbole według tej samej zasady, co w systemie dziesiętnym, możemy liczyć w nieskończoność.
00000000 - 1 bajt
10110010 - 1 bajt
01011011 - 1 bajt
Liczba możliwych, niepowtarzalnych kombinacji bitów w jednym bajcie wynosi 256 (2 8 = 256). Wróćmy jednak bliżej Javy. Istnieje taki typ danych całkowitych - byte
. Ten typ może przyjmować wartości od -128 do 127, a jedna liczba w pamięci komputera zajmuje dokładnie 8 bitów, czyli 1 bajt. Jedna liczba tego typu zajmuje dokładnie 1 byte
pamięć komputera. I tutaj nazwy pokrywają się nie przez przypadek. Jak pamiętamy, 1 bajt może przechowywać 256 różnych wartości. A jeden numer typu byte
może przyjmować 256 różnych wartości (128 ujemnych, 127 dodatnich i 1 zero). Każda wartość liczbowa byte
ma unikalny zestaw ośmiu bitów. Dzieje się tak nie tylko w przypadku typu byte
, ale wszystkich typów całkowitych. Typ byte
podano jako przykład najmniejszy. Poniższa tabela przedstawia wszystkie typy całkowite Java i zajmowaną przez nie przestrzeń pamięci: Rozważmy typ int
. Może przechowywać 2147483648 wartości ujemnych, 2147483647 wartości dodatnich i jedno zero. Całkowity:
2147483648 + 2147483647 + 1 = 4294967296.
Ten typ zajmuje 32 bity w pamięci komputera. Liczba możliwych kombinacji ze zbioru 32 zer i jedynek wynosi:
232 = 4294967296.
Taka sama liczba, jak liczba wartości, jakie może przechowywać typ int
. To tylko demonstracja związku pomiędzy zakresem wartości typu danych a jego rozmiarem (liczbą bitów w pamięci). Dowolną liczbę dowolnego typu w Javie można przekonwertować na plik binarny. Zobaczmy, jak łatwo można to zrobić za pomocą języka Java. Dowiemy się na przykładzie typu int
. Ten typ ma własną klasę opakowania - Integer
. I ma taki toBinaryString
, który wykona całą pracę za nas:
int
liczba zajmuje 32 bity. Kiedy jednak w powyższym przykładzie wypiszemy liczbę 10, w konsoli zobaczymy liczbę 1010. Dzieje się tak, ponieważ zera początkowe nie są drukowane. Gdyby były wyświetlane, zamiast 1010 zobaczylibyśmy w konsoli 00000000000000000000000000001010. Jednak dla łatwiejszej percepcji wszystkie zera wiodące zostały pominięte. Nie jest to takie trudne, dopóki nie zadasz sobie pytania: a co z liczbami ujemnymi? Postrzega informacje tylko w systemie binarnym. Okazuje się, że znak minus również należy zapisać w kodzie binarnym. Można to zrobić za pomocą kodu bezpośredniego lub uzupełniającego.
Kod bezpośredni
Metoda reprezentacji liczb w systemie liczb binarnych, w której najbardziej znaczący bit (bit skrajnie lewy) jest przypisany do znaku liczby. Jeśli liczba jest dodatnia, skrajny lewy bit jest zapisywany jako 0, jeśli jest ujemny – 1.Dodatkowy kod
Używając dodatkowego kodu, możesz uniknąć wad kodu bezpośredniego. Istnieje prosty algorytm uzyskania dodatkowego kodu liczby. Spróbujmy uzyskać dodatkowy kod dla liczby -5. Przedstawmy tę liczbę za pomocą kodu uzupełnienia do dwójki w systemie liczb binarnych. Krok 1. Otrzymujemy reprezentację liczby ujemnej za pomocą kodu bezpośredniego. Dla -5 będzie to 10000101. Krok 2. Odwróć wszystkie cyfry z wyjątkiem cyfry znaku. Zamieńmy wszystkie zera na jedynki, a jedynki na zera wszędzie z wyjątkiem lewego bitu.
10000101 => 11111010
Krok 3. Dodaj jeden do wynikowej wartości:
11111010 + 1 = 11111011
Gotowy. Wartość -5 otrzymaliśmy w systemie binarnym za pomocą kodu uzupełnienia do dwójki. Jest to ważne dla zrozumienia poniższego materiału, ponieważ Java używa kodu uzupełnienia do dwóch do przechowywania liczb ujemnych w bitach.
Rodzaje operacji bitowych
Skoro już omówiliśmy wszystkie wstępy, porozmawiajmy o operacjach bitowych w Javie. Operacja bitowa wykonywana jest na liczbach całkowitych, a jej wynikiem jest liczba całkowita. W tym procesie liczba jest konwertowana na postać binarną, wykonywana jest operacja na każdym bicie, a wynik jest ponownie konwertowany na dziesiętny. Lista operacji znajduje się w poniższej tabeli: Jak już się dowiedzieliśmy, liczby można przedstawić jako zbiór bitów. Operacje bitowe wykonują operacje na dokładnie każdym bicie takiej reprezentacji. WeźmyNOT
, AND
, OR
, XOR
. Przypomnijmy, że ostatnio przyglądaliśmy się tabelom prawdy tylko dla operandów logicznych. W tym przypadku te same operacje są stosowane do każdego bitu liczby całkowitej.
Bitowy operator jednoargumentowy NOT ~
Operator ten zastępuje wszystkie zera jedynkami, a jedynki zerami. Załóżmy, że mamy liczbę 10 w zapisie dziesiętnym. W systemie binarnym liczba ta wynosi 1010. Jeśli zastosujemy do tej liczby jednoargumentowy operator negacji bitowej, otrzymamy coś takiego: Przyjrzyjmy się, jak to wygląda w kodzie Java:public static void main(String[] args) {
int a = 10;
System.out.println(" a = " + a + "; binary string: " + Integer.toBinaryString(a));
System.out.println("~a = " + ~a + "; binary string: " + Integer.toBinaryString(~a));
}
Zobaczmy teraz, co wyświetli się w konsoli:
Bitowy operator AND
Ten operator dotyczy dwóch liczb. Wykonuje operacjęAND
pomiędzy bitami każdej liczby. Spójrzmy na przykład: Ta operacja jest wykonywana na dwóch liczbach. Przykład w kodzie Java:
Bitowy operator OR
OR dotyczy dwóch liczb. Wykonuje operację OR pomiędzy bitami każdej liczby: Przyjrzyjmy się teraz, jak by to wyglądało w IDEA:Operacja bitowa, wyłączne OR (XOR)
Spójrzmy na ten sam przykład, ale z nową operacją: Przykładowy kod:Przesunięcie bitowe w lewo
Operator ten ma zastosowanie do dwóch operandów, co oznacza, że w operacjix << y
bity liczby x
przesuną się y
w lewo. Co to znaczy? Spójrzmy na przykład operacji.Wynikiem 10 << 1
operacji będzie liczba 20 w systemie dziesiętnym. Jak widać na powyższym schemacie, wszystkie bity są przesunięte w lewo o 1. Podczas tej operacji traci się wartość najbardziej znaczącego bitu (bitu skrajnego z lewej strony). A najmniej znaczący bit (najbardziej prawy bit) jest wypełniony zerem. Co możesz powiedzieć o tej operacji?
-
Przesuwając bity liczby
X
oN
bity w lewo, mnożymy liczbęX
przez 2 N .Oto przykład:
-
Ale! Znak liczby może się zmienić, jeśli bit o wartości 1 zajmie skrajne lewe położenie.
-
Jeśli przesuniesz się w lewo w nieskończoność, liczba po prostu zmieni się na 0. Zademonstrujmy punkty 2 i 3:
Przesunięcie bitowe w prawo
Ten operator dotyczy dwóch operandów. Te. w operacjix >> y
bity liczby x
przesuną się y
w prawo. Spójrzmy na inny przykład. Przeanalizujmy schematycznie działanie 10 >> 1
. Przesuńmy wszystkie bity liczby 10 o jedną pozycję w prawo: Podczas operacji przesuwania tracimy właściwe bity. Po prostu znikają. Bit skrajnie lewy jest znakiem liczby (0 jest dodatnie, 1 jest ujemne). Dlatego w wartości końcowej jest on umieszczony tak samo, jak w liczbie pierwotnej. Przykład z liczbą ujemną: Najbardziej prawy bit zostaje utracony, a skrajny lewy bit jest kopiowany z oryginalnej liczby, jako honorowy znak liczby. Jak to wszystko zrobić w IDEA? W zasadzie nic skomplikowanego, po prostu weź i przesuń:
X
w N
prawo o bity, dzielimy ją X
przez 2 do potęgi 2 N
. Demonstracja:
public class BitOperationsDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
int shiftOperationResult = 2048 >> i;
int devideOperationResult = 2048 / (int) Math.pow(2, i);
System.out.println(shiftOperationResult + " - " + devideOperationResult);
}
}
}
Co tu się dzieje?
-
Pętla, w której zmienna i jest zwiększana od 1 do 10.
- W każdej iteracji obliczamy 2 wartości:
-
Do zmiennej zapisujemy
shiftOperationResult
wynik przesunięcia liczby 2048 o i bitów w prawo; -
devideOperationResult
Wynik podzielenia liczby 2048 przez 2 do potęgi i zapisujemy do zmiennej . -
Wyświetlamy dwie uzyskane wartości parami.
GO TO FULL VERSION