Kako postaviti pametne telefone i računala. 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 koji se mogu koristiti za provjeru i modifikaciju stanja pojedinačnih bitova odgovarajućih vrijednosti. Tablica 4.2 daje sažetak ovih operatora. Bit aritmetički operatori tretiraju svaki bit kao neovisnu vrijednost.

Tablica 4.2. Bitni aritmetički operatori

Operater

Proizlaziti

Operater

Proizlaziti

bitno I(I)

Bitno I (I) s dodjelom

bitno ILI(ILI)

bitno ILI (ILI) s dodjelom

bitno isključivi OR(XOR)

pobitno isključivi ILI (XOR) s dodjelom

pomak udesno

desni pomak s dodjelom

desni pomak s nultom popunom

desni pomak nula dopunjena dodjelom

pomak ulijevo

lijevi pomak sa zadatkom

po bitovima unarna negacija(NE)

Tablica 4.3 pokazuje kako svaki od bitnih aritmetičkih operatora utječe na moguće kombinacije bitova svojih operanda.

Tablica 4.3

Pomak ulijevo

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

Pomak udesno

Operator >> znači unutra jezik Java pomak udesno. Pomiče sve bitove svog lijevog operanda udesno za broj pozicija navedenih u desnom operandu. Kada se bitovi lijevog operanda pomaknu iza krajnje desne pozicije riječi, gube se. Prilikom pomaka udesno, ispražnjeni bitovi višeg reda (lijevo) pomaknutog broja ispunjavaju se prethodnim sadržajem bita predznaka. To je učinjeno tako da kada se pomaknu udesno, brojevi zadrže svoj znak.

Desni pomak bez predznaka

Često se zahtijeva da prilikom pomaka udesno ne dođe do proširenja bita predznaka, a oslobođeni lijevi bitovi se popune nulama. U tu svrhu koristi se nepredpisani desni operator pomaka >>>.

4.3. Relacijski operatori

Kako bi se usporedile dvije vrijednosti, Java ima skup operatora koji opisuju relaciju i jednakost. Popis takvih operatora dan je u tablici 4.4.

Tablica 4.4

Operater

Proizlaziti

jednaki

nejednak

više

manje

više ili jednako

manje ili jednako

Vrijednosti bilo koje vrste, uključujući cijele brojeve, realne brojeve, znakove, booleove vrijednosti i reference, mogu se usporediti pomoću operatora jednakosti == i nejednakosti !=. Imajte na umu da je u Javi test jednakosti označen nizom (==). Jedan znak (=) je operator dodjele.

Relacijski operatori mogu se primijeniti samo na operande numeričkih tipova. Uz njihovu pomoć možete raditi s cjelobrojnim, stvarnim i karakternim tipovima. Svaki od relacijskih operatora vraća booleov rezultat, tj. ili pravi, ili lažno.

Bilješke s predavanja o Javi. Lekcija 4

(ništa) (ništa) ::
(ništa)
(V. Fesjunov)

Operacije (operatori) u jeziku Java

Većina Java operacija je jednostavna i intuitivna. To su operacije kao što su +, -, *, /,<,>itd. Operacije imaju svoj redoslijed izvršenja i prioritete. Tako u izrazu

Prvo se izvodi množenje, a zatim zbrajanje jer je prioritet operacije množenja veći od prioriteta operacije zbrajanja. U izrazu

prvo se izračuna a + b, a zatim se od rezultata oduzme c, budući da je redoslijed ovih operacija s lijeva na desno.

Ali Java operacije također imaju svoje karakteristike. Ne ulazeći u Detaljan opis najjednostavnijih operacija, usredotočimo se na značajke.

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

  • Operacija dodjele označena je simbolom "=". On procjenjuje vrijednost svog desnog operanda i dodjeljuje je lijevom operandu, te proizvodi dodijeljenu vrijednost kao rezultat. Ovu vrijednost mogu koristiti druge operacije. Slijed višestrukih operacija dodjele izvodi se 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 zbroj a i b, rezultat se upisuje u x. Ali evo još dva primjera.

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

Operacije usporedbe

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

Operacije inkrementiranja i dekrementiranja

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

Ali postoji jedna suptilnost kod ovih operacija. Postoje u dva oblika - prefiks (++y) i postfiks (y++). Radnja ovih operacija je ista - povećavaju (operacije dekrementacije - smanjuju) svoj operand za 1, ali su im rezultati različiti. Prefiksni oblik vraća vrijednost operanda koji je već promijenjen za 1 kao rezultat, a postfiksni oblik daje vrijednost operanda prije promjene.

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

U ovom isječku x će dobiti vrijednost 5, a y će dobiti vrijednost 7.

Operacija cjelobrojnog dijeljenja

Treba uzeti u obzir da se dijeljenjem jednog cijelog broja drugim dobiva cijeli broj, a ne zaokružuje se, već se odbacuje razlomački dio.

Ostatak dijeljenja (modulo vrijednost)

Java ima operator % koji označava ostatak dijeljenja.

Proširene operacije dodjele

Uz uobičajenu operaciju "=" u Javi, postoje operacije +=, -=, *=, /= itd. Ovo su skraćeni zapisi. Dakle, a += b je potpuno ekvivalentno a = a + b. Isto vrijedi i za druge takve operacije.

Logičke operacije

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

Operandi ovih operacija moraju biti tipa Boolean, a rezultat mora biti Boolean. Operacije && i || imaju jednu osobitost - njihov desni operand možda neće biti izračunat ako je rezultat već poznat iz lijevog operanda. Dakle, ako je lijevi operand operacije && false, tada desni operand neće biti procijenjen, jer rezultat je i dalje laž.

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

Bitovne logičke operacije

Ovo su operacije

& - bitno "i" | - po bitovima "ili" ^ - po bitovima "isključivo ili" ~ - po bitovima negacija

Izvršavaju se za svaki par bitova svojih operanda.

Radnje smjene

<< — сдвиг влево >> - desni pomak >>> - desni pomak bez predznaka

Ove operacije pomiču vrijednost svog lijevog operanda za broj bitova navedenih u desnom operandu.

Uvjetni rad

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

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

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

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

Operacija lijevanja tipa

Ovo je vrlo važna operacija. Prema zadanim postavkama, u Javi su zabranjene sve transformacije koje bi mogle uzrokovati probleme. Dakle, ne možete dodijeliti dugu vrijednost int operandu. U slučajevima kada je to još uvijek potrebno, morate osigurati eksplicitnu konverziju tipa.

Na primjer, neka metoda f(...) vrati long.

int x = (int)f(10);

Ovdje (int) je operacija pretvorbe tipa. Operacija pretvorbe tipa označena je upotrebom naziva tipa u zagradama.

Ova se operacija odnosi ne samo na osnovne vrste, ali i na nastavu. Ovo ćemo detaljnije pogledati kada budemo govorili o nasljeđivanju.

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 - 1,23 e-3 je 0,00123

Za označavanje vrste konstante koriste se sufiksi: l (ili L) - dugo, f (ili F) - plutajuće, d (ili D) - dvostruko. Na primjer,

1L je jedinica, ali dugog tipa.

Booleovi literali

Booleovi literali su istiniti i lažni.

String literali

Učlanite se dvostruki navodnici, Na primjer

"ovo je niz"

Literali znakova

Napisani su apostrofima, na primjer "F", "sh".

String i znakovni literali imaju pravila za pisanje posebnih riječi. likovi. Prvo, postoji skup unaprijed definiranih posebnih ponuda. likovi. Ovaj

- "\n" - kraj retka (pokretanje retka) - "\r" - povratak na novi red - "\t" - tabeliranje

i niz drugih.

Drugo, možete eksplicitno zapisati kod simbola (samo ga trebate znati). Pisanje koda se obično vrši u oktalni sustav: "\001" - znak s kodom 1 itd.

Izjave

Operator - izraz

Sintaksa

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

Takav se operator sastoji od jednog izraza koji završava s ";". Njegovo djelovanje je procijeniti izraz, izračunatu vrijednost ovim izrazom, izgubljeno. Oni. Obično takav izraz sadrži operator dodjele, iako to sintaksa ne zahtijeva.

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

Uvjetna izjava (if)

Sintaksa

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

Ovdje<условие>- Ovo logički izraz, tj. izraz koji vraća true ili false. Kao što možete vidjeti iz sintakse, else dio nije obavezan. Nakon if i after else nalazi se po jedna izjava. Ako tamo trebate postaviti nekoliko operatora, tada morate staviti blok . Blok počinje s "(" i završava s ")".

U Javi je uobičajeno uvijek staviti 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, zastavica je booleova varijabla ili polje, metoda init() se poziva ako je zastavica istinita (rečeno "ako je zastavica postavljena").

Izjava o povratu (već pokriveno)

Operator petlje while

Sintaksa

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

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

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

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

Operator petlje postuvjeta (do while)

Sintaksa

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

Operator petlje postuvjeta razlikuje se od operatora petlje preduvjeta samo po tome što se u njemu iteracija petlje uvijek izvodi barem jednom, dok u operatoru preduvjeta ne smije biti niti jedne iteracije petlje (ako je uvjet odmah lažan).

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

Naredba petlje s brojačem (za)

Sintaksa

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

Zaglavlje takve petlje sadrži tri izraza (u najjednostavnijem slučaju). Iz naziva operatora možete shvatiti da služi za organiziranje petlje s brojačem. Stoga izraz<инициализация>izvršava se jednom prije prve iteracije petlje. Nakon svake iteracije petlje izraz se izvršava<инкремент>, a zatim izraz<условие>. Zadnji izraz mora biti logičan i služi za postavljanje uvjeta za nastavak petlje. Oni. sve dok je istina, petlja će se nastaviti petljati.

Radi praktičnosti sastavljanja operatora petlje s brojačem, u ovu su konstrukciju uvedena mnoga proširenja.

  • <инициализация>možda nije izraz, već opis s inicijalizacijom tipa "int i = 0".
  • <инициализация>može biti popis izraza odvojenih zarezima, na primjer, "i = 0, r = 1" .
  • <инкремент>također može biti popis izraza, na primjer, "i++, r*=2"
  • Sve komponente (<инициализация>, <условие>I<инкремент>) nisu obavezni. Za izražavanje<условие>to znači da se uvjet uvijek smatra istinitim (tj. izlaz iz petlje mora biti organiziran na neki način unutar same petlje).

Oni. Dopustimo i ovakvu petlju (beskonačnu petlju):

Za (;;) ( . . . )

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

Ovo je "najekonomičnija" implementacija petlje iz prethodnih primjera.

prekinuti i nastaviti izjave

U Javi nema goto naredbi. Kao što znate, goto vodi do nestrukturiranih programa. Izjave break i continue su strukturirani analozi goto.

Mogu se koristiti u petljama, a break se također može koristiti u naredbi switch. Izvođenje break naredbe uzrokuje trenutni prekid petlje. Naredba continue uzrokuje kraj trenutne iteracije petlje i početak nove. U ovom slučaju, uvjet je još uvijek provjeren, tako da nastavak također može uzrokovati završetak petlje.

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

Ovdje je oddOnly logična varijabla. Ako je postavljeno, tada se sve parne iteracije petlje preskaču korištenjem naredbe continue;

Uvjet prekida petlje u ovom primjeru provjerava se 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 ih okružuje. Da biste to učinili, naredba petlje koja ga 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 prekid kao za petlju, i dok.

Operator prebacivanja

Služi za organizaciju odabira jedne od nekoliko grana izvršenja na temelju određene vrijednosti.

Sintaksa

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

Izraz mora dati vrijednost cijelog broja ili znaka, a konstante moraju biti istog tipa kao i vrijednost izraza.

"case" elementi<константа>:" su oznake prijelaza; ako se vrijednost izraza podudara s konstantom, prijelaz će se izvršiti na ovu oznaku. Ako se vrijednost izraza ne podudara ni s jednom od konstanti, tada sve ovisi o prisutnosti zadani fragment. Ako postoji, prijelaz će se dogoditi na zadanu oznaku, ako nije prisutan, tada se cijela naredba switch preskače.

  • U naredbi switch, fragmenti slučaja ne tvore nikakve blokove. Ako nakon zadnjeg iskaza danog fragmenta slučaja postoji sljedeći slučaj, tada će se izvođenje nastaviti počevši od prvog iskaza ovog fragmenta slučaja.
  • Zbog toga naredba switch obično koristi naredbu break. Nalazi se na kraju svakog fragmenta kućišta.

Primjer (SymbolTest.java datoteka)

Pogledajmo demo program koji koristi za izjave i prebaciti.

Ovaj program generira nasumično 100 znakova latinica i klasificira ih kao "samoglasnike", "suglasnike" i "ponekad samoglasnike". U zadnja kategorija dodijeljeni su simboli "y" i "w".

Javna klasa SymbolTest ( public static void main(String args) ( for (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("согласная"); } } } }

Postoji nekoliko elemenata koji su nam novi u ovom primjeru.

  • Koristi se metoda random() klase Math. Pogledajmo dokumentaciju za razred matematike i vidimo što radi.
  • U naredbi char c = (char)(Math.random()*26 + "a"); vrši se zbrajanje aritmetička vrijednost sa simbolom. S ovim dodatkom u Javi, znak se pretvara u broj koji je jednak kodu ovog znaka.
  • U izjavi System.out.print(c + ": "); Ne koristi se println(...), nego print(...). Metoda print(...) razlikuje se od println(...) samo po tome što ne ispisuje na nova linija, tako da će se sljedeća izjava print(...) ili println(...) nastaviti ispisivati ​​u istom retku.

Također biste trebali obratiti pozornost na fragmente kućišta. Formalno postoji 7 takvih fragmenata, ali 5 od njih ne sadrže nijedan operator. Dakle, možemo smatrati da postoje 2 fragmenta slučaja, ali svaki od njih ima nekoliko oznaka slučaja.

Domaća zadaća

  • 1 Promijenite SymbolTest.java tako da broj generiranih simbola bude određen parametrom poziva programa.
  • 2 Napišite program koji uzima dva broja kao parametre poziva - duljine krakova pravokutnog trokuta, i kao rezultat ispisuje kutove u stupnjevima.


(ništa)

Zadnja izmjena: 30.10.2018

Nad pojedinim znamenkama ili bitovima brojeva izvode se bitne ili bitne operacije. U ovim operacijama samo cijeli brojevi mogu djelovati kao operandi.

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

Na primjer, uzmite sljedeće varijable:

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

Vrsta bajta zauzima 1 bajt odnosno 8 bita, predstavljenih s 8 bitova. Prema tome, vrijednost varijable b in binarni kod bit će jednako 00000111. Kratki tip zauzima 2 bajta ili 16 bita u memoriji, pa broj ove vrste bit će predstavljen sa 16 bitova. I u u ovom slučaju varijabla s u binarnom obliku će imati vrijednost 0000 0000 0000 0111.

Za pisanje potpisanih brojeva u Javi koristite dodatni kod (komplement dvojke), u kojem je najznačajnija znamenka potpisana. Ako je njegova vrijednost 0, tada je broj pozitivan i njegova se binarna reprezentacija ne razlikuje od broja bez predznaka. Na primjer, 0000 0001 in decimalni sustav 1.

Ako je najvažniji bit 1, tada imamo posla s negativnim brojem. Na primjer, 1111 1111 predstavlja -1 u decimalnom obliku. 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 sustavu je jednako 10 i ima dvije znamenke, broj 7 je 111 i ima tri znamenke.

    & (logičko množenje)

    Množenje se izvodi po bitovima, a ako oba operanda imaju bitne vrijednosti jednake 1, tada operacija vraća 1, inače se vraća broj 0. Na primjer:

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

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

    U drugom slučaju, umjesto 2, imamo broj 4, koji kao i broj 5 u prvoj znamenki ima 1, pa je ovdje rezultat operacije (1*1, 0*0, 0 *1 ) = 100 bit će broj 4 u decimalnom obliku.

    | (logičan dodatak)

    Ova se operacija također izvodi na binarnim bitovima, ali sada se vraća jedan ako barem jedan broj u danom bitu ima jedinicu (operacija "logičko ILI"). 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čko isključivo ILI)

    Ova se operacija također naziva XOR i često se koristi za jednostavno šifriranje:

    Int broj = 45; // 1001 Vrijednost koju treba šifrirati - u binarnom obliku 101101 int ključ = 102; //Ključ šifriranja - u binarnom sustavu 1100110 int encrypt = broj ^ ključ; //Rezultat će biti broj 1001011 ili 75 System.out.println("Šifrirani broj: " +encrypt); int dešifrirati = šifrirati ^ ključ; // Rezultat će biti izvorni broj 45 System.out.println("Dešifrirani broj: " + dekriptirati);

    Ovdje se također izvode operacije po bitovima. Ako imamo različite vrijednosti trenutne znamenke oba broja, tada se vraća 1, inače se vraća 0. Na primjer, rezultat izraza 9^5 bit će broj 12. A za dešifriranje broja koristimo obrnuti rad do rezultata.

    ~ (logička negacija)

    Operacija po bitovima koja invertira sve znamenke broja: ako je vrijednost znamenke 1, tada postaje jednaka nuli, i obrnuto.

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

Radnje smjene

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

    a<

    a>>b - pomiče broj a udesno za b znamenki. Na primjer, 16>>1 pomiče broj 16 (što je 10 000 u binarnom zapisu) jedno mjesto udesno, što rezultira 1000 ili brojem 8 u decimalnom zapisu.

    a>>>b - za razliku od prijašnjih vrsta smjena ovu operaciju predstavlja pomak bez predznaka - pomiče broj a udesno za b znamenki. Na primjer, izraz -8>>>2 bit će jednak 1073741822.

Dakle, ako se izvorni broj koji treba pomaknuti na jednu ili drugu stranu podijeli s dva, tada se zapravo dobije množenje ili dijeljenje s dva. Stoga se takva operacija može koristiti umjesto izravnog množenja ili dijeljenja s dva, jer je operacija pomaka na hardverskoj razini jeftinija operacija, za razliku od operacije dijeljenja ili množenja.

Većina operacija na primitivni tipovi izvodi se ne korištenjem metoda, već korištenjem posebni znakovi, nazvao znak operacije.

Operator dodjele

Zadatak varijabla vrijednosti poziva se konstanta, druga varijabla ili izraz (varijable i/ili konstante odvojene znakovima operatora). operacija dodjele i označen je znakom " = ", na primjer: x = 3 ; y = x; z = x; U Javi je moguće koristiti operator dodjele više puta u jednom izrazu, na primjer: x1 = x2 = x3 = 0 ; Ova operacija se izvodi iz zdesna ulijevo, tj. varijabli x3 prvo se dodjeljuje vrijednost 0, zatim varijabli x2 vrijednost varijable x3 (0), a na kraju varijabli x1 vrijednost varijable x2 (0). Znakovi za operacije čiji su argumenti brojevi podijeljeni su u dvije kategorije: unarni(unarni) predznaci operacija s jednim argumentom i binarni(binarni) s dva argumenta.

Unarne operacije

U Javi su definirani sljedeći unarni operatori:
  • unarni minus " - " – mijenja predznak broja ili izraza u suprotan;
  • unarni plus " + " – ne izvodi nikakve radnje na broju ili izrazu;
  • bitni komplement "~" (samo za cijele brojeve) – invertira 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 unarne operacije" + " i " - ": int i = 3, j, k; j= - i; // j = -3 k = + i; // k = 3 Primjer operacije bitnog komplementa: int a = 15 ; int b; b = ~a; // b = -16 Brojevi a i b su brojevi tip int, tj. računalo predstavlja interno kao predznačene binarne cijele brojeve duljine 32 bita, tako da bi binarna reprezentacija brojeva a i b izgledala ovako: a = 00000000 00000000 00000000 00001111 b = 11111111 11111111 11111111 11110000 može vidjeti iz ove reprezentacije, sve nulti bitovi u broju a mijenjaju se u jedan bit u b, a jedan bitovi u a mijenjaju se u nula bitovi. Decimalni prikaz b je –16. Znakovi operacije povećanja i smanjenja mogu se postaviti ispred ili iza varijable. Ove su opcije tako imenovane prefiks I postfiks bilježenje ovih transakcija. Znak operatora u notaciji prefiksa vraća vrijednost svog operanda nakon procjena izraza. U postfiksnoj notaciji, znak operacije isprva 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 bit će dodijeljena vrijednost 2 jer će vrijednost x prvo biti povećana za 1, a zatim će rezultat biti dodijeljen varijabli y. Varijabli z bit će dodijeljena vrijednost 1 jer će se prvo varijabli z dodijeliti vrijednost, a zatim će se vrijednost x povećati za 1. U oba slučaja, nova vrijednost x će biti 2. Treba napomenuti da se u Javi, za razliku od jezika C, operacije dekrementiranja i inkrementiranja također mogu primijeniti na stvarne varijable ( tip plovka i dvostruko). Znakovi binarnih operacija dijele se na operacije s numeričkim rezultatom i operacije usporedbe čiji je rezultat Booleova 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 s drugim, a rezultat će imati isti predznak kao i dividenda), na primjer, rezultat operacije 5%3 bit će jednak 2, a rezultat operacije (-7) %(-4) bit će jednak -3. U Java operacija također se može koristiti za realne varijable (float ili double tip).
Binarni primjeri aritmetičke operacije: 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 (pri dijeljenju cijelih brojeva // frakcija odbačeno) x5 = x% 4 // x5 = 3 (ostatak dijeljenja// 7 sa 4)

Bitove operacije

  • Bitne operacije uzimaju u obzir izvornik numeričke vrijednosti kao polja bitova i izvršite sljedeće akcije na njima:
  • postavljanje malo u ja Pozicija polja rezultata je 1 ako su oba bita unutra ja Pozicije operanda su jednake 1, ili 0 inače – bit-wise AND ("& ");
  • postavljanje malo u ja Pozicija polja rezultata je 1 ako postoji najmanje jedan bit ja th pozicija operanda je jednaka 1, ili 0 inače – bit-wise OR (" | ");
  • postavljanje malo u ja Pozicija polja rezultata je 1 ako su bitovi unutra ja-th položaji operanda nisu međusobno jednaki ili na 0 u suprotnom – pobitno isključivi ILI (" ^ ");
  • pomak ulijevo od bitova polja prvog operanda za broj bitova određenih drugim operandom (bit predznaka broja se ne mijenja) - bitni pomak ulijevo uzimajući u obzir znak "<< ";
  • desni pomak bitova prvog polja operanda za broj bitova koji određuje drugi operand (bit predznaka broja se ne mijenja) – bitni pomak udesno, uzimajući u obzir znak " >> ";
  • pomak udesno od bitova polja prvog operanda za broj bitova određenih drugim operandom (bit predznaka broja također je pomaknut) - bitni pomak udesno bez uzimanja u obzir " >>> " znak.
Primjeri bitovnih operacija:
  1. Bitno I

    int x = 112; int y = 94; int z; z = x & y; // z=80: 00000000 00000000 00000000 01010000
  2. Bitno 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. Bitno isključivi 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. Pomak ulijevo na temelju znaka

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Desni pomak sa znakom

    int x = - 17, z; z = x >> 2; // z = -5: 11111111 11111111 11111111 11111011
  6. Desni pomak bez uzimanja u obzir predznaka

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

Kombinirane operacije

U Javi, za binarne aritmetičke operacije možete koristiti kombinirani(složeni) znakovi operatora: identifikator operacija = izraz Ovo je ekvivalentno sljedećoj operaciji: identifikator = identifikator operacija izraz 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 usporedbe

Java definira sljedeće operatore usporedbe:
  • " == " (jednako), " != " (nije jednako),
  • " > " (veće od), " >= " (veće od ili jednako),
  • " < " (меньше) " <= " (меньше или равно)
imaju dva operanda i vraćaju booleovu vrijednost koja odgovara rezultatu usporedbe ( lažno ili pravi). Imajte na umu da kada se uspoređuju dvije količine za jednakost u Javi, kao u C i C++, simboli " == " (dva uzastopna znaka jednakosti bez razmaka), za razliku od operatora dodjele koji koristi simbol " = ". Upotreba simbola " = " pri usporedbi dviju vrijednosti ili uzrokuje pogrešku kompilacije ili dovodi do netočnog rezultata. Primjeri operacija usporedbe: boolean je jednako, nijejednako, je veće, je veće ili jednako, manje je, manje je ili jednako; 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; jeManje = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

Booleove operacije

Booleove operacije izvode se na Booleovim varijablama i njihov rezultat je također vrijednost tipa Booleov. Sljedeće Booleove operacije definirane su u Javi:
  • negacija "!" – zamjena lažnog s istinitim ili obrnuto;
  • I operacija "&" – rezultat je istinit samo ako su oba operanda istinita, inače je rezultat lažan;
  • OR operacija "|" – rezultat je istinit samo ako je barem jedan od operanda istinit, inače je rezultat lažan.
  • isključiva ILI operacija "^" – rezultat je istinit samo ako operandi nisu međusobno jednaki, inače je rezultat lažan.
Operacije " & ", " | " i " ^ " mogu se, kao i odgovarajuće bitne operacije, koristiti u složenim operacijama dodjele: " &= ", " |= " i " ^= " Osim toga, operacije " = " primjenjivi su na Booleove operande = " (jednako) i " != " (nije jednako). Kao što možete vidjeti iz definicije operatora OR i AND, operacija OR rezultira rezultatom true kada je prvi operand istinit, bez obzira na vrijednost drugog operanda, a operacija AND rezultira rezultatom false kada je prvi operand operand je lažan, bez obzira na vrijednost drugog operanda. Java definira još dva Booleova operatora: drugu verziju Booleovih AND i OR operatora, poznatih kao logički operatori kratkog spoja: kratko-I "&&" i kratko-spojno ILI "||". Kada koristite ove operacije, drugi operand uopće neće biti procijenjen, što je korisno u slučajevima kada ispravno funkcioniranje desnog operanda ovisi o tome je li lijevi operand istinit ili laž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 = true isNotValid = ! isValid; // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange != isValid

Uvjetni rad

Uvjetna operacija je zapisana u obliku izraz-1?izraz-2:izraz-3. U ovom slučaju, prvo se procjenjuje izraz izraz-1, koji bi trebao dati Booleovu vrijednost, a zatim, ako izraz-1 ima vrijednost true, izraz-2 se procjenjuje i vraća kao rezultat operacije, ili (ako izraz- 1 daje vrijednost false), izraz-2 se procjenjuje i vraća. , kao rezultat operacije, vraća se izraz-3. Primjer uvjetne operacije: x= n> 1? 0:1; Varijabli x bit će dodijeljena vrijednost 0 ako je n>1 (izraz n>1 je istinit) ili 1 ako je n≤1 (izraz n>1 je netočan).

Radni staž

Operacije u izrazima se izvode slijeva nadesno, ali u skladu s njihovim prioritetom. Dakle, operacije množenja u izrazu y = x + z* 5; će se izvršiti prije operacije zbrajanja jer je prioritet operacije množenja veći od prioriteta operacije zbrajanja. Prioriteti operacija (redoslijedom padajućeg prioriteta) u Javi dati su u tablici. 1.
Zagrade povećavaju prvenstvo operacija koje se nalaze unutar njih. Dakle, ako umetnete zagrade u gornji izraz: y = (x + z) * 5 ; tada će se prvo izvršiti operacija zbrajanja, a zatim operacija množenja. Ponekad se zagrade koriste jednostavno kako bi izraz bio čitljiviji, na primjer: (x > 1 ) && (x<= 5 ) ;

Pretvorba i lijevanje pri izvođenju operacija

Operacije dodjele i aritmetički izrazi mogu koristiti literale, varijable i izraze raznih vrsta, na primjer: dvostruko y; bajt x; y = x + 5; Ovaj primjer dodaje bajt varijablu x int literalu 5 i dodjeljuje rezultat dvostrukoj varijabli y. U Javi, kao iu jeziku C, pretvorbe tipa pri vrednovanju izraza mogu se izvesti automatski ili pomoću operatora pretvaranja tipa. Međutim, pravila za pretvaranje tipa malo su drugačija od pravila jezika C i općenito su stroža nego u jeziku C. Prilikom izvođenja operacije dodjele, pretvorba tipa događa se automatski ako širenje transformacije(pretvorba proširenja) i dvije vrste su kompatibilne. Transformacije koje se šire su transformacije bajt® kratak® int® dugo® plutati® dvostruko. Za proširenje konverzija, numerički tipovi, uključujući cijeli broj i pokretni zarez, kompatibilni su jedni s drugima. Međutim, numerički tipovi nisu kompatibilni s tipovima char i Boolean. Tipovi char i boolean također su međusobno nekompatibilni. Java također izvodi automatsku konverziju tipa kada pohranjuje literalnu cjelobrojnu konstantu (koja je zadana int) u varijabli tipa byte, short ili long (međutim, ako literal ima vrijednost izvan raspona važećih vrijednosti za taj tip, izdaje se poruka o pogrešci: mogući gubitak točnosti). Ako je pretvorba sužavajuća pretvorba, to jest ako se izvodi byte ¬ short ¬ char ¬ int ¬ long ¬ float ¬ dvostruka pretvorba, tada takva pretvorba može dovesti do gubitka preciznosti broja ili do njegovog iskrivljenja. Stoga se tijekom konverzija sužavanja, prilikom prevođenja programa, prikazuje dijagnostička poruka o nekompatibilnosti tipa i datoteke klase se ne stvaraju. Ova će se poruka također prikazati ako pokušate pretvoriti izraz tipa byte ili short u varijablu tipa char. Ako je još uvijek potrebno izvršiti takve pretvorbe, koristi se operacija pretvaranja tipa koja ima sljedeći format: ( pretvorba tipa) značenje, Gdje pretvorba tipa određuje tip u koji se dati podaci moraju pretvoriti značenje, na primjer, kao rezultat izvršavanja operatora: byte x = 71 ; simbol char = (char ) x; varijabla simbola dobit će vrijednost " G ". Ako je vrijednost s pomičnim zarezom dodijeljena tipu cijelog broja, tada (ako vrijednost s pomičnim zarezom ima razlomački dio) dolazi i do eksplicitne pretvorbe tipa skraćivanje(skraćeni) brojevi. Dakle, kao rezultat izvršavanja operatora int x = (int) 77.85; varijabla x će dobiti vrijednost 77 . Ako je dodijeljena vrijednost izvan raspona pretvorba tipa , tada će rezultat transformacije biti ostatak dijeljenja vrijednosti s modulom raspona dodijeljenog tipa (za brojeve tipa byte, modul raspona bit će jednak 256, kratko – 65536, za int – 4294967296 i na duže – 18446744073709551616). Na primjer, kao rezultat izvršavanja operatora byte x = (byte ) 514 ; varijabla x će dobiti vrijednost 2. Prilikom pretvaranja cijelih ili realnih brojeva u podatke tipa char, pretvaranje u znak se događa ako je izvorni broj u rasponu od 0 do 127, inače znak dobiva vrijednost "?". Prilikom izvođenja aritmetičkih i bitovnih pretvorbi, sve bajtove i kratke vrijednosti, kao i char, proširuju se na int, (s numeričkom vrijednošću koda znaka korištenog u izračunima za char) tada, ako je barem jedan operand tipa long , tip cjelobrojnog izraza se proširuje na long . Ako je jedan od operanda tipa float, tada se tip punog izraza proširuje na float, a ako je jedan od operanda tipa double, tada je tip rezultata double. Dakle, ako su varijable byte 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, budući da je konstanta 15 tipa long, rezultat izračuna će se proširiti na long prije oduzimanja. Nakon toga, budući da je literal 1.5 tipa float, prije zbrajanja s ovim literalom, rezultat procjene a + b*c – 15L bit će proširen na float. Prije izvođenja zbrajanja na broju 1.08, rezultat prethodnih izračuna će se proširiti na double (budući da su stvarne konstante tipa double prema zadanim postavkama) i na kraju, prije nego što se izvede posljednje zbrajanje, literal 10 (zadano int) bit će proširen na dvostruko . Stoga će rezultat vrednovanja izraza biti tipa double. Automatska proširenja tipa (osobito short i byte to int proširenja) mogu uzrokovati loše prepoznate pogreške tijekom kompilacije. Na primjer, u operatorima: bajt x = 30 , y = 5 ; x = x + y; Varijable x i y bit će proširene na int prije nego što se izvrši zbrajanje, a zatim će se prikazati poruka o pogrešci kada se pokuša dodijeliti rezultat int varijabli byte. Da biste to izbjegli, morate koristiti eksplicitnu konverziju tipa u drugom operatoru: x = (bajt) (x + y) ; Izraz x + y mora biti u zagradama jer je prvenstvo operacije pretvaranja tipa u zagradama veće od prioriteta operacije zbrajanja. Usput, ako napišete drugi operator u obliku: x += y; tada neće biti poruke o grešci. Link na prvi

Zadnja izmjena: 30.10.2018

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

Aritmetičke operacije uključuju brojeve. Java ima binarne aritmetičke operacije (izvode se na dva operanda) i unarne aritmetičke operacije (izvode se na jednom operandu). Binarne operacije uključuju sljedeće:

    operacija zbrajanja 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 dvostruka d = 22,5 / 4,5; // 5.0

    Jednu stvar koju treba imati na umu prilikom dijeljenja je da ako operacija uključuje dva cijela broja, rezultat dijeljenja će biti zaokružen na najbliži cijeli broj, čak i ako je rezultat dodijeljen varijabli s pomičnim brojem ili dvostrukoj varijabli:

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

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

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

    dobivanje ostatka pri dijeljenju 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 na jednom broju: ++ (inkrement) i -- (dekrement). Svaka od operacija ima dvije varijante: prefiks i postfiks:

    ++ (povećanje prefiksa)

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

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

    ++ (postfiksni inkrement)

    Također predstavlja povećanje varijable za jedan, npr. z=y++ (najprije se varijabli z dodjeljuje vrijednost varijable y, a zatim se vrijednost varijable y povećava za 1)

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

    -- (smanjenje prefiksa)

    smanjenje varijable za jedan, npr. z=--y (prvo se vrijednost varijable y smanjuje za 1, a zatim se njena vrijednost dodjeljuje varijabli z)

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

    -- (postfiksni 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); // 8

Prioritet aritmetičkih operacija

Neke operacije imaju veći prioritet od drugih i stoga se izvode prve. Operacije prema padajućem redoslijedu prioriteta:

++ (povećanje), -- (smanjenje)

* (množenje), / (dijeljenje), % (ostatak dijeljenja)

+ (zbrajanje), - (oduzimanje)

Pri izvršavanju skupa aritmetičkih izraza treba uzeti u obzir prioritet operacija:

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

Prvo će se izvršiti operacija inkrementiranja ++b, koja ima veći prioritet - inkrementirati će vrijednost varijable b i vratiti je kao rezultat. Zatim se izvodi množenje 5 * ++b, a tek na kraju se izvodi zbrajanje a + 5 * ++b

Zagrade vam omogućuju da redefinirate redoslijed izračuna:

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

Iako operacija zbrajanja ima niži prioritet, prvo će se izvršiti zbrajanje, a ne množenje, jer je operacija zbrajanja u zagradama.

Asocijativnost operacija

Osim prioriteta, operacije se razlikuju po konceptu kao što su asocijativnost. Kada operacije imaju isti prioritet, redoslijed vrednovanja određen je asocijativnošću operatora. Ovisno o asocijativnosti, postoje dvije vrste operatora:

    Lijevi asocijativni operatori, koji se izvode s lijeva na desno

    Desni asocijativni operatori, koji se izvode s desna na lijevo

Stoga neke operacije, poput množenja i dijeljenja, imaju isti prioritet. Što će onda biti rezultat u izrazu:

Int x = 10 / 5 * 2;

Trebamo li ovaj izraz tumačiti kao (10 / 5) * 2 ili kao 10 / (5 * 2)? Uostalom, ovisno o tumačenju, dobit ćemo različite rezultate.

Zato što su svi aritmetički operatori (osim prefiksnog inkrementa i dekrementa) lijevo-asocijativni, odnosno izvršavaju se slijeva nadesno. 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 pomičnim zarezom nisu prikladni za financijske i druge izračune gdje pogreške zaokruživanja mogu biti kritične. Na primjer:

Dupli 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,89999999999999999. Ove pogreške preciznosti nastaju jer se na niskoj razini binarni sustav koristi za predstavljanje brojeva s pomičnim zarezom, ali ne postoji binarni prikaz za broj 0,1 niti za druge frakcijske vrijednosti. Stoga se u takvim slučajevima obično koristi klasa BigDecimal koja vam omogućuje da zaobiđete takve situacije.

Najbolji članci na temu