Kako podesiti pametne telefone i računare. Informativni portal

Aritmetičke operacije. Proširene operacije dodjele

Za cjelobrojne numeričke tipove podataka - long, int, short, char i byte - definiran je dodatni skup operatora pomoću kojih možete provjeriti i modificirati stanje pojedinačnih bitova odgovarajućih vrijednosti. Tabela 4.2 daje sažetak ovih operatora. Bit aritmetički operatori rade sa svakim bitom kao nezavisnom vrijednošću.

Tabela 4.2. Bit aritmetički operatori

Operater

Rezultat

Operater

Rezultat

bitwise AND(I)

Bitno I (I) sa zadatkom

OR(ILI)

bitno OR (ILI) sa zadatkom

bitovsko isključivo OR(XOR)

bitovsko isključivo OR (XOR) sa dodjelom

pomak udesno

desni pomak sa zadatkom

pomak udesno ispunjen nulama

pomak udesno ispunjen nulama sa dodjelom

pomak lijevo

pomak ulijevo sa zadatkom

bitna unarna negacija(NE)

Tabela 4.3 pokazuje kako svaki od bitnih aritmetičkih operatora utiče na moguće kombinacije bita njihovih operanada.

Tabela 4.3

Lijeva smjena

Operater<< выполняет сдвиг влево всех битов своего левого операнда на число позиций, заданное правым операндом. При этом часть битов в левых разрядах выходит за границы и теряется, а соответствующие правые позиции заполняются нулями.

Pomak udesno

Operator >> znači pomak udesno u Javi. Pomiče sve bitove svog lijevog operanda udesno za broj pozicija specificiranih desnim operandom. Kada se bitovi lijevog operanda gurnu iza krajnje desne pozicije riječi, gube se. Prilikom pomjeranja udesno, oslobođene visoke (lijeve) cifre pomaknutog broja popunjavaju se prethodnim sadržajem potpisane cifre. To se radi tako da pri pomicanju udesno brojevi zadrže svoj predznak.

Nepotpisani desni pomak

Često je potrebno da se pri pomicanju udesno predznak bit ne širi, a prazne lijeve cifre popune nulama. U tu svrhu se koristi nepotpisani operator desnog pomaka >>>.

4.3. Relacioni operatori

Da bi se mogle uporediti dvije vrijednosti, Java ima skup operatora koji opisuju odnos i jednakost. Spisak takvih operatora prikazan je u tabeli 4.4.

Tabela 4.4

Operater

Rezultat

jednaki

nije jednako

više

manje

više ili jednako

manje ili jednako

Vrijednosti bilo kojeg tipa, uključujući cijele brojeve, realne brojeve, simbole, logičke vrijednosti i reference, mogu se porediti pomoću operatora jednakosti == i operatora nejednakosti! =. Imajte na umu da je u Javi testiranje jednakosti označeno nizom (==). Jedan znak (=) je operator dodjeljivanja.

Operatori relacije se mogu primijeniti samo na operande numeričkih tipova. Uz njihovu pomoć možete raditi s cijelim, realnim i karakternim tipovima. Svaki od relacijskih operatora vraća logički rezultat, tj. ili tačno ili false.

Bilješke sa predavanja na Javi. Sesija 4

(nema) (nema) ::
(nijedna)
(V. Fesyunov)

Java operateri

Većina Java operacija je jednostavna i intuitivna. To su operacije kao što su +, -, *, /,<,>Operacije imaju sopstveni redosled izvođenja i prioritete. Tako u izrazu

prvo se vrši množenje, a zatim sabiranje, pošto množenje ima veći prioritet od sabiranja. U izrazu

prvo se izračunava a + b, a zatim se od rezultata oduzima c, jer je redoslijed ovih operacija slijeva na desno.

Ali Java operacije imaju svoje posebnosti. Ne ulazeći u detaljan opis najjednostavnijih operacija, zadržimo se na karakteristikama.

Počnimo sa zadaci... Za razliku od brojnih drugih programskih jezika u Javi, dodjela nije operator, već operacija. Semantika ove operacije može se opisati na sljedeći način.

  • Operacija dodjele je označena simbolom "=". Izračunava vrijednost svog desnog operanda i dodjeljuje ga lijevom operandu i vraća dodijeljenu vrijednost kao rezultat. Ovu vrijednost mogu koristiti druge operacije. Slijed od nekoliko zadataka se izvodi s desna na lijevo.

U najjednostavnijem slučaju, sve izgleda kao i obično.

Ovdje se događa upravo ono što intuitivno mislimo - izračunava se zbir a i b, rezultat se upisuje u x. Ali evo još dva primjera.

U prvom se prvo 1 upisuje u b, rezultat operacije je 1, zatim se ovaj rezultat unosi u a. U drugom primjeru izračunava se zbir a i b i rezultat se gubi. To je besmisleno, ali sintaktički valjano.

Operacije poređenja

Ovo su operacije>,<, >=, <=, != и ==. Следует обратить внимание, что сравнение на равенство обозначается двумя знаками "=". Операндами этих операций могут быть арифметические данные, результат — типа boolean.

Operacije povećanja, smanjenja

To su operacije ++ i -. Dakle, y ++ (inkrement) je skraćenica za y = y +1, slično kao i operacija smanjenja (-).

Ali postoji jedna suptilnost ovih operacija. Dolaze u dva oblika, prefiks (++ y) i postfiks (y ++). Učinak ovih operacija je isti - povećavaju (operacije smanjivanja - smanjuju) svoj operand za 1, ali njihov rezultat je drugačiji. Prefiksni oblik kao rezultat daje vrijednost operanda koji je već promijenjen za 1, a postfiksni oblik daje vrijednost operanda prije promjene.

A = 5; x = a ++; y = ++ a;

U ovom isječku, x će biti postavljeno na 5, a y na 7.

Operacija cjelobrojnog dijeljenja

Treba imati na umu da dijeljenje jedne cjeline drugom proizvodi cjelinu, a ne zaokružuje, već odbacuje razlomak.

Ostatak dijeljenja (modulo vrijednost)

Java ima % operator, koji označava ostatak podjele.

Proširene operacije dodjele

Pored uobičajene "=" operacije u Javi, postoje operacije + =, - =, * =, / =, itd. Ovo su stenografske oznake. Dakle, a + = b je potpuno ekvivalentno a = a + b. Slično, s drugim takvim operacijama.

Logičke operacije

! - negacija && - logičko "i" || - logično "ili"

Operandi ovih operacija moraju biti tipa boolean, rezultat je boolean. && i || imaju jednu posebnost - njihov desni operand možda neće biti izračunat ako je rezultat već poznat iz lijevog operanda. Dakle, ako je lijevi operand operacije && netačan, tada desni operand neće biti izračunat, jer rezultat je i dalje lažan.

Ovo svojstvo se mora uzeti u obzir, posebno kada desni operand sadrži poziv neke funkcije.

Bitove logičke operacije

Ovo su operacije

& - bitno "i" | - bitsko "ili" ^ - bitno "isključivo ili" ~ - bitna negacija

Izvršavaju se za svaki par bitova njihovih operanada.

Operacije smjena

<< — сдвиг влево >> - pomak udesno >>> - nepotpisani pomak udesno

Ove operacije pomjeraju vrijednost svog lijevog operanda za broj bitova specificiranih desnim operandom.

Uslovni rad

Ovo je jedina ternarna operacija, tj. operacija koja ima tri operanda. Prema tome, za to se ne koristi jedan znak operacije, već dva.

<условие> ? <выражение1> : < выражение2>

Ako<условие>istina je, rezultat je< выражение1>, inače< выражение2>.

Na primjer, "a< b ? a: b" вычисляет минимум из a и b.

Operacija livenja

Ovo je veoma važna operacija. Po defaultu, sve konverzije koje mogu dovesti do problema su zabranjene u Javi. Dakle, ne možete dodijeliti dugu vrijednost int operandu. U slučajevima kada je to i dalje potrebno, morate staviti eksplicitnu konverziju tipa.

Na primjer, pretpostavimo da metoda f (...) vraća long.

int x = (int) f (10);

Ovdje (int) je operacija konverzije tipa. Operacija konverzije tipa je označena imenom tipa u zagradama.

Ova operacija se ne odnosi samo na osnovne tipove, već i na klase. Ovo ćemo detaljnije pogledati kada pogledamo nasljeđe.

Literali (konstante)

Aritmetika

Primjeri aritmetičkih konstanti

10 - 010 je 8 - 0123 je 83 (1 * 64 + 2 * 8 + 3) - 0x10 je 16 - 0x123 je 291 (1 * 256 + 2 * 16 +3) - 1e5 je 100000 - 3 je 1,23 e.

Za označavanje tipa konstante koriste se sufiksi: l (ili L) - dugačak, f (ili F) - plutajući, d (ili D) - dvostruki. Na primjer,

1L je jedan, ali tipa dugačak.

Boolean literals

Booleovi literali su istiniti i lažni

String literali

Piše se u dvostrukim navodnicima, na primjer

"ovo je niz"

Literali znakova

Pišu se u apostrofima, na primjer "F", "w".

U literalima stringova i znakova postoje pravila za pisanje specijalnih znakova. karaktera. Prvo, postoji skup unaprijed definiranih specijalaca. karaktera. Ovo

- "\ n" - kraj reda (prevod u red) - "\ r" - povratak na nosač - "\ t" - tab

i niz drugih.

Drugo, možete eksplicitno napisati kod karaktera (samo ga trebate znati). Kod se obično piše u oktalnom sistemu: "\ 001" je znak sa kodom 1, itd.

Izjave

Operator - Izraz

Sintaksa

<выражение>;

Takav operator se sastoji od jednog izraza, na kraju je ";". Njegova akcija je da procijeni izraz, vrijednost izračunata ovim izrazom se gubi. One. obično takav izraz sadrži operator dodjeljivanja, iako sintaksa to ne zahtijeva.

A = 0; x = (a> b? a: b); cnt ++;

Uslovna izjava (ako)

Sintaksa

ako (<условие>) <оператор1>

Evo<условие>Je logičan izraz, tj. izraz koji vraća true ili false. Kao što možete vidjeti iz sintakse, drugi dio je opcionalan. Postoji jedan operator iza if i iza else. Ako trebate staviti nekoliko operatora tamo, onda morate staviti blok . Blokiraj počinje sa "(" i završava sa ")".

U Javi je uobičajeno da se uvijek stavlja blok, čak i ako postoji jedna izjava nakon if ili else.

If (a> b) (x = a;) else (x = b;) if (flag) (flag = false; init ();)

U posljednjem primjeru, flag je logička varijabla ili polje, init () je metoda koja se poziva ako je zastava istinita (kažu "ako je zastava postavljena").

Povratna izjava (već viđena)

Operator petlje prema preduvjetu (while)

Sintaksa

dok (<условие>) <оператор>

Kao i kod if naredbe, to je uobičajeno u Javi<оператор>staviti u vitičaste zagrade.

Int i = 0; dok (više) (x / = 2; više = (++ i< 10); }

U ovom primjeru, more bi trebalo biti logička varijabla ili polje, x neka aritmetička varijabla ili polje. Ciklus se izvodi 10 puta.

Operator postuslovne petlje (radi while)

Sintaksa

Uradi<оператор>dok (<условие>);

Operator petlje po postuslovu razlikuje se od operatora petlje po preduslovu samo po tome što se iteracija petlje u njemu uvijek izvršava barem jednom, dok u operatoru preduvjeta ne može biti niti jedna iteracija petlje (ako je uvjet odmah netačan).

Int i = 0; uradi (x \ = 2; više = (++ i< 10); } while (more);

Operator kontra petlje (za)

Sintaksa

za (<инициализация>; <условие>; <инкремент>) <оператор>

Zaglavlje takvog ciklusa sadrži tri izraza (u najjednostavnijem slučaju). Iz imena operatera može se shvatiti da služi za organizovanje ciklusa sa brojačem. Stoga izraz<инициализация>se izvršava jednom prije prve iteracije petlje. Nakon svake iteracije petlje, izraz se izvršava<инкремент>a zatim izraz<условие>... Posljednji izraz mora biti logičan i koristi se za postavljanje uvjeta za nastavak ciklusa. One. sve dok je to istina, petlja će nastaviti da se vrti.

Za praktičnost sastavljanja operatora petlje sa brojačem, u ovu konstrukciju je uvedeno mnogo proširenja.

  • <инициализация>možda nije izraz, već opis sa inicijalizacijom tipa "int i = 0".
  • <инициализация>može biti lista izraza razdvojenih zarezima, kao što je "i = 0, r = 1".
  • <инкремент>može biti i lista izraza, na primjer, "i ++, r * = 2"
  • Sve komponente (<инициализация>, <условие>i<инкремент>) nisu obavezni. Da izrazim<условие>to znači da se uslov uvijek smatra istinitim (tj. izlaz iz petlje mora biti organiziran na neki način unutar same petlje).

One. recimo sljedeću petlju (beskonačnu petlju):

Za (;;) (...)

Za (int i = 0; i< 10; i++) x /=2;

Ovo je najekonomičnija implementacija petlje od prethodnih primjera.

Prekini i nastavi izjave

U Javi nema naredbi goto. Kao što znate, goto vodi do nestrukturiranih programa. Naredbe break i continue su strukturirane analogije goto.

Mogu se koristiti u petljama, a break se također može koristiti u naredbi switch. Izvršenje naredbe break uzrokuje da se petlja odmah završi. Naredba continue uzrokuje završetak tekuće iteracije petlje i početak nove. U ovom slučaju, provjera uvjeta se i dalje izvodi, tako da nastavak može uzrokovati i kraj petlje.

Za (int i = 0;; i ++) (ako (oddOnly && i% 2 == 0) nastavi; y = (x + 1) / x; ako (y - x< 0.001) break; x = y; }

Ovdje je oddOnly logička varijabla. Ako je postavljeno, tada se sve iteracije petlje s parnim brojevima preskaču korištenjem naredbe nastavljanja;

Uslov završetka petlje u ovom primjeru se provjerava u sredini petlje, i ako je zadovoljen, petlja se prekida pomoću naredbe break.

Kod ugniježđenih petlji, naredbe break i continue mogu se odnositi ne samo na petlju u kojoj se nalaze, već i na petlju koja ga okružuje. Da biste to učinili, naredba petlje koja okružuje mora biti označena oznakom, koja mora biti navedena u naredbi break ili continue. Na primjer,

Lbl: dok (...) (... Za (...) (... Ako (...) break lbl;)...)

Ovdje će naredba break uzrokovati završetak i for petlje i while petlje.

Izjava o odabiru (prekidač)

Služi za organizovanje selekcije po nekoj vrednosti jedne od nekoliko grana izvršenja.

Sintaksa

Prekidač (<выражение>) (slučaj<константа1>: <операторы1>slučaj<константа2>: <операторы2> . . . }

Izraz mora vratiti vrijednost cijelog broja ili znakova, a konstante moraju biti istog tipa kao i vrijednost ovog izraza.

Elementi kućišta<константа>: "su oznake skoka, ako se vrijednost izraza poklapa sa konstantom, tada će se izvršiti skok na ovu oznaku. Ako vrijednost izraza ne odgovara nijednoj od konstanti, onda sve zavisi od prisustva zadanog fragmenta. Ako je, tada dolazi do prijelaza na zadanu oznaku, ako ne, onda se cijeli switch naredba preskače.

  • U naredbi switch, fragmenti slučaja ne formiraju nikakve blokove. Ako nakon posljednje naredbe ovog case-fragmenta postoji sljedeći case, onda će se izvršenje nastaviti, počevši od prve izjave ovog case-fragmenta.
  • Zbog toga se naredba break obično koristi u naredbi switch. Nalazi se na kraju svake kutije-fragmenta.

Primjer (SymbolTest.java fajl)

Razmislite o demo programu koji koristi izraze for i switch.

Ovaj program generiše nasumično 100 znakova latinice i klasifikuje ih kao "samoglasnike", "suglasnike" i "ponekad samoglasnike". Posljednja kategorija uključuje simbole "y" i "w".

Javna klasa SymbolTest (javni statički void main (String args) (za (int i = 0; i< 100; i++) { char c = (char)(Math.random()*26 + "a"); System.out.print(c + ": "); switch (c) { case "a": case "e": case "i": case "o": case "u": System.out.println("гласная"); break; case "y": case "w": System.out.println("иногда гласная"); break; default: System.out.println("согласная"); } } } }

U ovom primjeru postoji nekoliko elemenata koji su nam novi.

  • Koristi se random () metoda klase Math. Pogledajmo dokumentaciju za klasu matematike i vidimo šta ona radi.
  • U iskazu char c = (char) (Math.random () * 26 + "a"); aritmetička vrijednost se dodaje simbolu. Sa ovim dodatkom u Javi, simbol se pretvara u broj koji je jednak kodu ovog simbola.
  • U naredbi System.out.print (c + ":"); koristi se ne println (...), već print (...). Print (...) metoda se razlikuje od println (...) samo po tome što se ne ispisuje u novi red, tako da će sljedeći print (...) ili println (...) naredba nastaviti s ispisom na ista linija.

Treba obratiti pažnju i na fragmente kućišta. Formalno postoji 7 takvih fragmenata, ali 5 od njih ne sadrže nikakve operatore. Dakle, možemo pretpostaviti da postoje 2 fragmenta padeža, ali svaki od njih ima nekoliko oznaka padeža.

Zadaća

  • 1 Promijenite SymbolTest.java tako da je broj generiranih simbola specificiran parametrom poziva programa.
  • 2 Napišite program koji uzima dva broja kao parametre poziva - dužine krakova pravouglog trougla i kao rezultat ispisuje uglove u stepenima.


(nijedna)

Posljednje ažuriranje: 30.10.2018

Bitne ili bitne operacije se izvode na pojedinačnim bitovima ili bitovima brojeva. U ovim operacijama, kao operandi se mogu koristiti samo cijeli brojevi.

Svaki broj ima specifičan binarni prikaz. Na primjer, broj 4 u binarnom obliku je 100, a broj 5 je 101, i tako dalje.

Na primjer, uzmite sljedeće varijable:

Bajt b = 7; // 0000 0111 kratko s = 7; // 0000 0000 0000 0111

Tip bajta zauzima 1 bajt ili 8 bitova, respektivno, predstavljen sa 8 bitova. Stoga će binarna vrijednost varijable b biti 00000111. Kratki tip zauzima 2 bajta ili 16 bita u memoriji, tako da će broj ovog tipa biti predstavljen sa 16 bita. I u ovom slučaju, varijabla s u binarnom sistemu će imati vrijednost 0000 0000 0000 0111.

Za pisanje potpisanih brojeva u Javi koristite dodatni kod(komplement dva), u kojem je najznačajniji bit potpisan. Ako je njegova vrijednost 0, tada je broj pozitivan i njegov binarni prikaz se ne razlikuje od broja bez predznaka. Na primjer, 0000 0001 u decimalnom broju 1.

Ako je najznačajniji bit 1, onda imamo posla s negativnim brojem. Na primjer, 1111 1111 u decimalnom obliku predstavlja -1. Prema tome, 1111 0011 predstavlja -13.

Logičke operacije

Logičke operacije nad brojevima predstavljaju bitne operacije. U ovom slučaju, brojevi se razmatraju u binarnom prikazu, na primjer, 2 u binarnom sistemu je jednako 10 i ima dvije cifre, broj 7 - 111 i ima tri znamenke.

    & (logičko množenje)

    Množenje se vrši bit po bit, a ako oba operanda imaju bitne vrijednosti jednake 1, tada operacija vraća 1, u suprotnom se vraća broj 0. Na primjer:

    Int a1 = 2; // 010 int b1 = 5; // 101 System.out.println (a1 & b1); // rezultat je 0 int a2 = 4; // 100 int b2 = 5; // 101 System.out.println (a2 & b2); // rezultat je 4

    U prvom slučaju imamo dva broja 2 i 5. 2 u binarnom obliku predstavlja broj 010, a 5 - 101. Množenje brojeva po bitu (0 * 1, 1 * 0, 0 * 1) daje rezultat 000.

    U drugom slučaju, umjesto dva, imamo broj 4, koji u prvoj cifri ima 1, baš kao i broj 5, pa je ovdje rezultat operacije (1 * 1, 0 * 0, 0 * 1) = 100 će biti broj 4 u decimalnom formatu...

    | (logičan dodatak)

    Ova operacija se također izvodi na binarnim znamenkama, ali sada se vraća jedinica ako barem jedan broj u ovom bitu ima jedinicu ("logičko ILI" operacija). Na primjer:

    Int a1 = 2; // 010 int b1 = 5; // 101 System.out.println (a1 | b1); // rezultat 7 - 111 int a2 = 4; // 100 int b2 = 5; // 101 System.out.println (a2 | b2); // rezultat 5 - 101

    ^ (logički isključivi OR)

    Ova operacija se također naziva XOR, često se koristi za jednostavnu enkripciju:

    Int broj = 45; // 1001 Vrijednost koja se šifrira - u binarnom obliku 101101 int ključ = 102; // Ključ za šifriranje - u binarnom obliku 1100110 int encrypt = broj ^ ključ; // Rezultat će biti broj 1001011 ili 75 System.out.println ("Šifrirani broj:" + šifriranje); int dešifriranje = šifriranje ^ ključ; // Rezultat će biti originalni broj 45 System.out.println ("Dešifrirani broj:" + dešifriranje);

    Bitove operacije se također izvode ovdje. Ako imamo različite vrijednosti trenutnog bita za oba broja, onda se vraća 1, u suprotnom se vraća 0. Na primjer, rezultat izraza 9 ^ 5 će biti broj 12. A da dešifrujemo broj, primjenjujemo inverzna operacija rezultatu.

    ~ (logička negacija)

    Bitna operacija koja invertuje sve znamenke broja: ako je vrijednost bita 1, tada postaje nula, i obrnuto.

    Bajt a = 12; // 0000 1100 System.out.println (~ a); // 1111 0011 ili -13

Operacije smjena

Operacije pomaka se također izvode nad znamenkama brojeva. Pomak se može dogoditi udesno i ulijevo.

    a<

    a >> b - pomera broj a udesno za b cifara. Na primjer, 16 >> 1 pomiče broj 16 (koji je u binarnom sistemu 10.000) za jednu cifru udesno, odnosno rezultat je 1000 ili broj 8 u decimalnom zapisu.

    a >>> b - za razliku od prethodnih tipova pomaka, ova operacija predstavlja neoznačeni pomak - pomiče broj a udesno za b cifara. Na primjer, izraz -8 >>> 2 će biti jednak 1073741822.

Dakle, ako se originalni broj koji treba pomaknuti na jednu ili drugu stranu podijeli sa dva, tada se zapravo dobije množenje ili dijeljenje sa dva. Stoga se takva operacija može koristiti umjesto direktnog množenja ili dijeljenja sa dva, budući da je operacija pomaka na hardverskom nivou jeftinija od operacije dijeljenja ili množenja.

Većina operacija na primitivnim tipovima se ne izvode korištenjem metoda, već pomoću specijalnih znakova pod nazivom znak operacije.

Operacija dodjele

Dodjeljivanje varijabli vrijednosti konstante, druge varijable ili izraza (varijable i/ili konstante razdvojene znakovima operacije) naziva se operacija dodjele i označen je znakom " = ", na primjer: x = 3; y = x; z = x; U Javi je moguće ponovo koristiti operaciju dodjeljivanja u jednom izrazu, na primjer: x1 = x2 = x3 = 0; Ova operacija se izvodi s desna na lijevo, odnosno prvo se varijabli x3 dodjeljuje vrijednost 0, zatim se varijabli x2 dodjeljuje vrijednost varijable x3 (0), a na kraju varijabli x1 dodjeljuje se vrijednost varijable x2 (0). znakovi operacija čiji su argumenti brojevi spadaju u dvije kategorije: unarno(unarni) tokeni za operacije sa jednim argumentom i binarni(binarni) sa dva argumenta.

Unarne operacije

Sljedeće unarne operacije su definirane u Javi:
  • unarni minus "-" - mijenja znak broja ili izraza u suprotan;
  • unarno plus "+" - ne izvodi nikakvu radnju na broj ili izraz;
  • bitni komplement "~" (samo za cijele brojeve) - invertuje sve bitove brojčanog polja (mijenja 0 u 1 i 1 u 0);
  • inkrement "++" (samo za cijele brojeve) - povećava vrijednost varijable za 1;
  • dekrement "-" (samo za cijele brojeve) - smanjuje vrijednost varijable za 1.
Primjeri unarnih operacija "+" i "-": int i = 3, j, k; j = - i; // j = -3 k = + i; // k = 3 Primjer operacije komplementa po bitu: int a = 15; int b; b = ~ a; // b = -16 Brojevi a i b su int, tj. su interno predstavljeni kao 32-bitni potpisani binarni cijeli brojevi, tako da će binarni prikaz brojeva a i b izgledati ovako: a = 00000000 00000000 00000000 00001111 b = 11111111 a se mijenja na one u b, a oni u a se mijenjaju na nulte bite. Decimalni prikaz b je –16. Znakovi operacije povećanja i smanjenja mogu se postaviti prije ili poslije varijable. Ove opcije su imenovane u skladu s tim prefiks i postfix snimanjem ovih operacija. Znak operatora u notaciji prefiksa vraća vrijednost svog operanda poslije vrednovanje izraza. Za postfiksnu notaciju, znak operacije prvo vraća vrijednost svog operanda i tek nakon toga izračunava inkrement ili dekrement, na primjer: int x = 1, y, z; y = ++ x; z = x ++; Varijabli y će biti dodijeljena vrijednost 2, jer će prvo vrijednost x biti povećana za 1, a zatim će rezultat biti dodijeljen varijabli y. Varijabli z će biti dodijeljena vrijednost 1, jer će prvo varijabli z biti dodijeljena vrijednost, a zatim će vrijednost x biti povećana za 1. U oba slučaja, nova vrijednost x će biti 2. Treba napomenuti da se u Javi, za razliku od C, operacije smanjivanja i povećanja mogu primijeniti i na realne varijable (tipova float i double). Binarni znakovi operacija dijele se na operacije s numeričkim rezultatom i operacije poređenja čiji je rezultat logička vrijednost.

Aritmetičke binarne operacije

Java definira sljedeće aritmetičke binarne operacije:
  • dodatak "+";
  • oduzimanje "-";
  • množenje " * ";
  • podjela "/";
  • izračunavanje ostatka dijeljenja cijelih brojeva "%" (vraća ostatak dijeljenja prvog broja sa drugim, a rezultat će imati isti predznak kao i dividenda), na primjer, rezultat operacije 5% 3 će biti 2, i rezultat operacije (-7) % (- 4) će biti -3. U Javi, operacija se također može koristiti za stvarne varijable (kao što su float ili double).
Primjeri binarnih aritmetičkih operacija: int x = 7, x1, x2, x3, x4, x5; x1 = x + 10; // x1 = 17 x2 = x - 8; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x / 4; // x4 = 1 (prilikom dijeljenja cijelih brojeva // razlomljeni dio se odbacuje) x5 = x% 4 // x5 = 3 (ostatak od dijeljenja// 7 po 4)

Bitove operacije

  • Bitne operacije tretiraju originalne numeričke vrijednosti kao bitna polja i na njima rade sljedeće:
  • postavljanje bita na i-th pozicija polja rezultata na 1, ako su oba bita unutra i-te pozicije operanada su jednake 1, ili 0, u suprotnom - po bitovima I ("&");
  • postavljanje bita na i-ta pozicija polja rezultata na 1, ako je barem jedan bit u i-te pozicije operanada su jednake 1, ili 0, u suprotnom - bitno OR ("|");
  • postavljanje bita na i-th pozicija polja rezultata na 1, ako su bitovi u i-te pozicije operanada nisu jednake jedna drugoj, ili 0, u suprotnom - bitovsko ekskluzivno OR ("^");
  • pomak bitova polja prvog operanda ulijevo za broj bitova koji je određen drugim operandom (značni bit broja se u ovom slučaju ne mijenja) - bitski pomak ulijevo, uzimajući u obzir znak "<< ";
  • pomak udesno od bitova polja prvog operanda za broj bitova koji je određen drugim operandom (predznačni bit broja se u ovom slučaju ne mijenja) - bitski pomak udesno, uzimajući u obzir " >>" znak;
  • pomak udesno od bitova polja prvog operanda za broj bitova koji je određen drugim operandom (značni bit broja je također pomaknut u ovom slučaju) - bitovsko pomicanje udesno bez uzimanja u obzir " >>>" znak.
Primjeri bitnih operacija:
  1. Bitwise AND

    int x = 112; int y = 94; int z; z = x & y; // z = 80: 00000000 00000000 00000000 01010000
  2. Bitwise OR

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x | y; // z = 126: 00000000 00000000 00000000 01111110
  3. Isključivo po bitu OR

    int x = 112; // x: 00000000 00000000 00000000 01110000 int y = 94; // y: 00000000 00000000 00000000 01011110 int z; z = x ^ y; // z = 46: 00000000 00000000 00000000 00101110
  4. Pomaknite ulijevo, uzimajući u obzir znak

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Pomak udesno, uzimajući u obzir znak

    int x = - 17, z; z = x >> 2; // z = -5: 11111111 11111111 11111111 11111011
  6. Pomak udesno bez obzira na znak

    int x = - 17, z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

Kombinovane operacije

U Javi se može koristiti za binarne aritmetičke operacije kombinovano(složeni) tokeni operacije: identifikator operacija = izraz Ovo je ekvivalentno sljedećoj operaciji: identifikator = izraz operacije identifikatora Primjeri:
  1. Izraz x + = b znači x = x + b.
  2. Izraz x - = b znači x = x - b.
  3. Izraz x * = b znači x = x * b.
  4. Izraz x / = b znači x = x / b.
  5. Izraz x% = b znači x = x% b.
  6. Izraz x & = b znači x = x & b.
  7. Izraz x | = b znači x = x | b.
  8. Izraz x ^ = b znači x = x ^ b.
  9. Izraz x<<= b означает x = x << b .
  10. Izraz x >> = b znači x = x >> b.
  11. Izraz x >>> = b znači x = x >>> b.

Operacije poređenja

Java definira sljedeće operatore poređenja:
  • "==" (jednako), "! =" (nije jednako),
  • ">" (veće od), "> =" (veće ili jednako),
  • " < " (меньше) " <= " (меньше или равно)
imaju dva operanda i vraćaju logičku vrijednost koja odgovara rezultatu poređenja ( false ili tačno). Imajte na umu da kada upoređujete dvije vrijednosti za jednakost u Javi, kao u C i C ++, simboli " == "(dva znaka jednakosti bez razmaka), za razliku od operatora dodjeljivanja, koji koristi " = ". Upotreba simbola" = "pri usporedbi dvije vrijednosti ili uzrokuje grešku kompilacije ili daje netačan rezultat. Primjeri operacija poređenja: boolean isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual; int x1 = 5, x2 = 5, x3 = 3, x4 = 7; je jednako = x1 == x2; // isEqual = true isNonEqual = x1! = x2; // isNonEqual = false isGreater = x1> x3; // isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2> = x3; je Manje = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

Bulove operacije

Bulove operacije se izvršavaju na logičkim varijablama i njihov rezultat je također vrijednost tipa boolean... Sljedeće logičke operacije su definirane u Javi:
  • negacija "!" - zamjena false sa istinitim, ili obrnuto;
  • I operacija "&" - rezultat je istinit samo ako su oba operanda tačna, u suprotnom rezultat je lažan;
  • ILI operacija "|" - rezultat je istinit samo ako je barem jedan od operanada istinit, u suprotnom rezultat je lažan.
  • isključiva ILI operacija "^" - rezultat je istinit samo ako operandi nisu jednaki jedan drugom, inače je rezultat lažan.
Operatori "&", "|" i "^" mogu se, kao i odgovarajući bitni operatori, koristiti u složenim operatorima dodjeljivanja: "& =", "| =" i "^ =" Osim toga, operacije " = su primjenjivi na Booleove operande. = "(jednako) i"! = "(nije jednako). Kao što možete vidjeti iz definicije OR i AND, operacija OR procjenjuje se na true kada je prvi operand istinit, bez obzira na vrijednost drugog operanda, a AND operator procjenjuje na false kada je prvi operand netačan, bez obzira na vrijednost drugog operanda. Java definira još dvije logičke operacije: drugu verziju logičkih AND i OR, poznate kao logičke operacije kratkog spoja: kratko AND "&&" i kratko OR "||". Kada koristite ove operacije, drugi operand se uopće neće evaluirati, što je korisno u slučajevima kada ispravna operacija desnog operanda ovisi o tome da li je lijevi operand istinit ili netačan. Primjeri booleovih operacija: boolean isInRange, isValid, isNotValid, isEqual, isNotEqual; int x = 8; isInRange = x> 0 && x< 5 ; // isInRange = false isValid = x >0 || x> 5; // isValid = istina isNotValid =! isValid; // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange! = isValid

Uslovni rad

Uslovna operacija je zapisana u obliku izraz-1?Izraz-2: izraz-3. U ovom slučaju se prvo procjenjuje izraz-1, koji bi trebao dati logičku vrijednost, a zatim, ako je izraz-1 istinit, izraz-2 se procjenjuje i vraća kao rezultat operacije, ili (ako je izraz-1 lažan ), a izraz-3 se vraća kao rezultat operacije. Primjer uslovne operacije: x = n> 1? 0: 1; Varijabli x će biti dodijeljena vrijednost 0 ako je n> 1 (izraz n> 1 daje vrijednost true) ili 1 ako je n≤1 (izraz n> 1 daje vrijednost netačno).

Starost operacija

Operacije u izrazima se izvode s lijeva na desno, međutim, prema njihovom prioritetu. Dakle, operacije množenja u izrazu y = x + z * 5; će se izvršiti prije operacije sabiranja jer je prioritet operacije množenja veći od prioriteta operacije sabiranja. Prioriteti operacija (po opadajućem prioritetu) u Javi su prikazani u tabeli. jedan.
Zagrade povećavaju prioritet operacija koje se nalaze u njima. Dakle, ako umetnete zagrade u gornji izraz: y = (x + z) * 5; tada će se prvo izvršiti operacija sabiranja, a zatim operacija množenja. Ponekad se zagrade koriste jednostavno kako bi izraz bio čitljiviji, na primjer: (x> 1) && (x<= 5 ) ;

Konverzija tipa i livenje prilikom izvođenja operacija

U dodeljivanju i aritmetičkim izrazima mogu se koristiti literali, varijable i izrazi različitih tipova, na primer: duplo y; bajt x; y = x + 5; Ovaj primjer dodaje bajt varijablu x literalu 5 (int) i dodjeljuje rezultat dvostrukoj varijabli y. U Javi, kao iu jeziku C, konverzije tipova u evaluaciji izraza mogu se izvršiti automatski ili pomoću operatora cast. Međutim, pravila kastinga su donekle drugačija od onih u jeziku C, i općenito su stroža nego u jeziku C. Prilikom izvođenja operacije dodjeljivanja, konverzija tipa se događa automatski ako transformacija proširenja(proširujuća konverzija) i ova dva tipa su kompatibilna... Proširene transformacije su transformacije bajt® kratko® int® dugo® float® duplo... Za konverzije proširenja, numerički tipovi, uključujući cijeli broj i pokretni zarez, kompatibilni su jedni s drugima. Međutim, numerički tipovi nisu kompatibilni sa char i booleovim tipovima. Tipovi char i boolean također nisu međusobno kompatibilni. Java također izvodi automatsku konverziju tipa kada pohranjuje literalnu integer konstantu (koja je po defaultu tipa int) u varijablama tipa byte, short ili long (međutim, ako literal ima vrijednost izvan raspona važećih vrijednosti za ovo tipa, prikazuje se poruka o grešci: mogući gubitak točnosti). Ako je konverzija sužavajuća konverzija, odnosno konverzija se izvodi bajt ¬ kratki ¬ char ¬ int ¬ dugo ¬ float ¬ dvostruko, onda takva konverzija može dovesti do gubitka preciznosti ili izobličenja broja. Stoga, uz sužavanje konverzija, kada se program kompajlira, prikazuje se dijagnostička poruka o nekompatibilnosti tipa i datoteke klasa se ne kreiraju. Ova poruka će se također prikazati kada pokušate pretvoriti izraze tipa byte ili short u varijablu tipa char. Ako je ipak potrebno izvršiti takve konverzije, koristi se operacija cast koja ima sljedeći format: ( tip konverzije) značenje, gdje tip konverzije definira tip u koji dato treba konvertirati značenje, na primjer, kao rezultat izvršavanja operatora: bajt x = 71; char simbol = (char) x; varijabla simbola će biti postavljena na "G". Ako je vrijednost s pomičnim zarezom dodijeljena cjelobrojnom tipu, tada (ako vrijednost s pomičnim zarezom ima razlomački dio), dolazi i do eksplicitne konverzije tipa skraćivanje(skraćeni) brojevi. Dakle, kao rezultat izvršavanja operatora int x = (int) 77,85; varijabla x će biti postavljena na 77. Ako je dodeljena vrednost izvan opsega tip-konverzije , tada će rezultat konverzije biti ostatak dijeljenja vrijednosti sa modulom opsega dodijeljenog tipa (za brojeve tipa bajt, modul opsega će biti 256, skraćeno - 65536, za int - 4294967296 , i dugo - 18446744073709551616). Na primjer, kao rezultat naredbe bajt x = (bajt) 514; varijabla x će biti postavljena na 2. Prilikom pretvaranja cijelih ili realnih brojeva u podatke tipa char, konverzija u znak se događa ako je originalni broj u rasponu od 0 do 127, u suprotnom znak dobiva vrijednost "?". Prilikom izvođenja aritmetičkih i bitnih konverzija, sve bajt i kratke vrijednosti, kao i char, se proširuju na int, (dok se numerička vrijednost koda karaktera koristi u proračunima za char) tada, ako je barem jedan operand tipa long , tip celobrojnog izraza se proširuje na long. Ako je jedan od operanada tipa float, tada se tip kompletnog izraza proširuje na float, a ako je jedan od operanada tipa double, tada će tip rezultata biti double. Dakle, ako su varijable deklarirane bajt a, c; kratko b; zatim u izrazu a + b * c - 15 L + 1,5F + 1,08 - 10; prvo, prije izračunavanja a + b * c, vrijednosti varijabli će se proširiti na int, zatim, pošto je konstanta 15 tipa long, rezultat izračuna će se povećati na mnogo prije oduzimanja. Nakon toga, pošto je literal 1.5 tipa float, rezultat izračunavanja a + b * c - 15L će se proširiti na float prije nego što se doda ovom literalu. Prije izvođenja sabiranja sa brojem 1.08, rezultat prethodnih proračuna će se proširiti na duplo (pošto su realne konstante po defaultu tipa double) i, konačno, prije izvođenja posljednjeg sabiranja, literal 10 (int po defaultu) će biti proširen na duplo. Dakle, rezultat evaluacije izraza će biti tipa double. Automatske ekstenzije tipa (posebno kratke i ekstenzije bajtova za int) mogu uzrokovati loše prepoznate greške u vremenu kompajliranja. Na primjer, u operatorima: bajt x = 30, y = 5; x = x + y; prije nego što se izvrši sabiranje, vrijednost varijabli x i y će biti proširena na int, a zatim će se prikazati poruka o grešci kada se pokuša dodijeliti rezultat izračunavanja tipa int varijabli tipa bajt. Da bi se to izbjeglo potrebno je koristiti eksplicitnu konverziju tipa u drugom operatoru: x = (bajt) (x + y); Morate staviti izraz x + y u zagrade jer je prioritet cast zatvorenog u zagradama veći od prioriteta operacije sabiranja. Usput, ako zapišete drugi operator kao: x + = y; neće biti poruke o grešci. Link do prvog

Posljednje ažuriranje: 30.10.2018

Većina operacija u Javi su slične onima koje se koriste u drugim jezicima sličnim C. Postoje unarne operacije (izvode se na jednom operandu), binarne operacije na dva operanda i ternarne operacije na tri operanda. Operand je varijabla ili vrijednost (na primjer, broj) uključena u operaciju. Razmotrimo sve vrste operacija.

Učestvuju u aritmetičkim operacijama brojevima. Java ima binarne aritmetičke operacije (izvode se na dva operanda) i unarne (izvode se na jednom operandu). Binarne operacije uključuju sljedeće:

    operacija sabiranja dva broja:

    Int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // jedanaest

    operacija oduzimanja dva broja:

    Int a = 10; int b = 7; int c = a - b; // 3 int d = 4 - a; // -6

    operacija množenja dva broja

    Int a = 10; int b = 7; int c = a * b; // 70 int d = b * 5; // 35

    operacija dijeljenja dva broja:

    Int a = 20; int b = 5; int c = a / b; // 4 dupla d = 22,5 / 4,5; // 5.0

    Vrijedi uzeti u obzir prilikom dijeljenja, jer ako su dva cijela broja uključena u operaciju, rezultat dijeljenja će biti zaokružen na cijeli broj, čak i ako je rezultat dodijeljen promjenljivoj s pomičnim brojem ili dvostrukom:

    Dvostruki k = 10/4; // 2 System.out.println (k);

    Da bi rezultat bio broj s pomičnim zarezom, jedan od operanada također mora predstavljati broj s pomičnim zarezom:

    Dvostruki k = 10,0 / 4; // 2.5 System.out.println (k);

    dobivanje ostatka dijeljenjem dva broja:

    Int a = 33; int b = 5; int c = a% b; // 3 int d = 22% 4; // 2 (22 - 4 * 5 = 2)

Postoje i dvije unarne aritmetičke operacije koje se izvode nad istim brojem: ++ (inkrement) i - (dekrement). Svaka od operacija ima dva tipa: prefiks i postfiks:

    ++ (prefiks inkrement)

    Pretpostavlja povećanje varijable za jedan, na primjer, z = ++ y (prvo se vrijednost varijable y povećava za 1, a zatim se njena vrijednost dodjeljuje varijabli z)

    Int a = 8; int b = ++ a; System.out.println (a); // 9 System.out.println (b); // 9

    ++ (postfix inkrement)

    Takođe predstavlja povećanje varijable za jedan, na primjer, z = y ++ (prvo se vrijednost y dodjeljuje z, a zatim se vrijednost y povećava za 1)

    Int a = 8; int b = a ++; System.out.println (a); // 9 System.out.println (b); // osam

    - (smanjenje prefiksa)

    smanjenje varijable za jedan, na primjer, z = - y (prvo se vrijednost varijable y smanjuje za 1, a zatim se njena vrijednost pripisuje varijabli z)

    Int a = 8; int b = --a; System.out.println (a); // 7 System.out.println (b); // 7

    - (postfiks dekrement)

    z = y-- (prvo se vrijednost varijable y dodjeljuje varijabli z, a zatim se vrijednost varijable y smanjuje za 1)

    Int a = 8; int b = a--; System.out.println (a); // 7 System.out.println (b); // osam

Aritmetički prioritet

Neke operacije imaju prednost nad drugima i stoga se izvode prve. Operacije u opadajućem redoslijedu prioriteta:

++ (inkrement), - (smanjenje)

* (množenje), / (podjela),% (ostatak od dijeljenja)

+ (sabiranje), - (oduzimanje)

Prioritet operacija treba uzeti u obzir prilikom izvršavanja skupa aritmetičkih izraza:

Int a = 8; int b = 7; int c = a + 5 * ++ b; System.out.println (c); // 48

Prvo će se izvršiti operacija povećanja ++ b, koja ima veći prioritet - povećaće vrijednost varijable b i kao rezultat je vratiti. Zatim se vrši množenje 5 * ++ b, a samo posljednji sabiranje je a + 5 * ++ b

Zagrade vam omogućavaju da redefinirate redoslijed izračunavanja:

Int a = 8; int b = 7; int c = (a + 5) * ++ b; System.out.println (c); // 104

Uprkos činjenici da operacija sabiranja ima niži prioritet, prvo će se izvršiti sabiranje, a ne množenje, jer je operacija sabiranja zatvorena u zagrade.

Asocijativnost operacija

Pored prioriteta, operacije se razlikuju po konceptu kao što je asocijativnost... Kada operacije imaju isti prioritet, redoslijed evaluacije je određen asocijativnošću operatora. Postoje dvije vrste operatora ovisno o asocijativnosti:

    Lijevi asocijativni operatori koji se izvršavaju s lijeva na desno

    Desno asocijativni operatori koji se izvršavaju s desna na lijevo

Na primjer, neke operacije, kao što su množenje i dijeljenje, imaju isti prioritet. Šta će onda biti rezultat u izrazu:

Int x = 10/5 * 2;

Da li ovaj izraz treba tumačiti kao (10/5) * 2 ili kao 10 / (5 * 2)? Zaista, u zavisnosti od interpretacije, dobićemo različite rezultate.

Pošto su svi aritmetički operatori (osim prefiksa inkrementa i dekrementa) lijevo asocijativni, odnosno izvršavaju se s lijeva na desno. Stoga se izraz 10/5 * 2 mora tumačiti kao (10/5) * 2, odnosno rezultat će biti 4.

Operacije s pomičnim zarezom

Treba napomenuti da brojevi s pokretnim zarezom nisu prikladni za finansijske i druge proračune gdje greške zaokruživanja mogu biti kritične. Na primjer:

Dvostruki d = 2,0 - 1,1; System.out.println (d);

U ovom slučaju, varijabla d neće biti jednaka 0,9, kao što bi se u početku moglo pretpostaviti, već 0,8999999999999999. Greške u preciznosti poput ove nastaju jer se na niskom nivou koristi binarni sistem za predstavljanje brojeva s pomičnim zarezom, ali ne postoji binarni prikaz za 0,1, kao ni za druge razlomke. Stoga, ako se u takvim slučajevima obično koristi klasa BigDecimal, koja vam omogućava da zaobiđete takve situacije.

Top srodni članci