Порозрядні операції

Існують наступні бінарні порозрядні операції:

& поразрядное І

| Поразрядное включає АБО

^ Поразрядное виключає АБО (XOR)

Крім того, є унарний оператор доповнення ~, який змінює стан кожного біта операнда на протилежне Доповнення цілого значення 0x00003333 дорівнює 0xffffcccc

Інші оператори, що працюють з операндами на рівні бітів, здійснюють зсув бітів в цілих значеннях Це наступні оператори:

<< зрушення вліво із заповненням правих бітів нулями

>> зрушення вправо із заповненням лівих бітів вмістом старшого (знакового) біта

>>>> > зрушення вправо із заповненням лівих бітів нулями

У лівій частині оператора зсуву вказується зрушувати значення, а в правій – кількість розрядів Наприклад, var >>> 2 зрушує біти змінної var на два розряди вправо і заповнює два старших біти нулями

Правила типів для операторів зсуву дещо відрізняються від тих, що застосовуються до інших бінарним операторам Тип результату оператора зсуву збігається з типом лівого операнда – тобто зрушуваної значення Якщо в лівій частині оператора зсуву варто величина типу int, то результат зсуву також матиме тип int, навіть якщо кількість зсуваються розрядів було представлено у вигляді значення типу long

Якщо кількість розрядів зсуву перевищує кількість біт у слові або якщо воно виявиться негативним, то фактична кількість розрядів зсуву буде відрізнятися від заданого Воно буде являти собою задану кількість із застосуванням маски, рівної розміру типу за вирахуванням одиниці Наприклад, для 32-розрядного значення типу

int використовується маска 0x1f (31), так що вирази n << 35 і n << -29 будуть еквівалентні

n&lt&lt3

Порозрядні оператори можуть також використовуватися з логічними значеннями & і | повертають ті ж значення, що і їх логічні аналоги && і | |, з однією важливою відмінністю: в порозрядних операторах завжди обчислюються обидва операнда, тоді як в логічних операторах обидва операнда обчислюються лише в разі потреби

Порозрядну оператор ^ повертає значення true, якщо операнди різняться – лише один з них дорівнює true, але не обидва відразу ^ Надає ще одну можливість для моделювання логічного виключає АБО :

if ((x &lt&lt 0) ^ (y &lt&lt 0))

differentSign()

else sameSign()

Порозрядні оператори можуть застосовуватися тільки для значень цілого і логічного типу, але не для значень з плаваючою крапкою або посилань Оператори зсуву застосовуються тільки для цілих типів У тих рідкісних випадках, коли вам знадобиться маніпулювати з бітами в поданні величини з плаваючою точкою, можна скористатися методами перетворення для класів Float і Double, розглянутими в розділі Float і Double на стор

519 Умовний оператор

Умовний оператор дозволяє всього в одному виразі вибрати одне з двох значень на підставі логічної змінної Приводиться нижче запис:

value = (userSetIt usersValue : defaultValue)

рівнозначна наступною:

if (userSetIt)

value = usersValue

else

value = defaultValue

Головна відмінність між операторами if і: Полягає в тому, що останній володіє власним значенням Умовний оператор забезпечує більш компактну запис, проте не всі програмісти погоджуються з тим, що він краще сприймається читачем програми Ми користуємося тим чи іншим варіантом залежно від обставин Використання дужок, оточуючих вираження умовного оператора, є питанням особистого смаку, і на практиці зустрічаються самі різні варіанти Сам язик не вимагає присутності дужок

Вирази-результати (друге і третє) повинні мати тип, сумісний з операцією привласнення Кожне з них має бути таким, щоб воно присвоювалося іншого без явного приведення типу Тип результату умовного оператора збігається з більш загальним з типів двох можливих результатів Наприклад, в операторі

double scale = (halveit 1 : 05)

результати відносяться до типів int (1) і float (05) Значення типу int може бути присвоєно змінної double, тому умовний оператор також має тип double Це правило зберігається і для посилань – якщо значення одного типу може присвоюватися іншому, то типом операції буде найбільш загальний (найменш розширюваний) з них Якщо жоден з цих типів не може бути присвоєний іншому, то операція є неприпустимою

Умовний оператор іноді називають або оператором знак питання / точка через форми його записи, або тернарного оператором, оскільки це єдиний тернарний (трьох-операндний) оператор в мові Java

520 Оператори присвоювання

Простий знак = є основною формою оператора присвоювання Java підтримує багато інших різновидів присвоювання Будь арифметичний або бінарний порозрядну оператор може бути обєднаний з = Для освіти оператора присвоювання Наприклад:

arr[where()] += 12

призводить до того ж результату, що і

arr[where()] = arr[where()] + 12

за винятком того, що в першому записі вираз в лівій частині обчислюється всього один раз

Для заданої змінної var типу Type, значення expr і бінарного оператора op запис

var op= expr

еквівалентна наступній:

var = (Type)((var) op (expr))

за винятком того, що значення var обчислюється всього один раз Це означає, що запис op = допустима лише в тому випадку, якщо оператор op може бути використаний для типів, що беруть участь у вираженні Так, ви не зможете застосувати << = з змінними типу double, тому що оператор зсуву << не працює з double.

Зверніть увагу на використання дужок у наведеній вище запису Вираз

a *= b + 1

еквівалентно

a = a * (b + 1)

але не

a = a * b + 1

Хоча a + = 1 – те ж саме, що і + + a, запис з використанням + + вва-шається більш наочною, і тому їй віддається перевага

521 Імена пакетів

Імя пакета являє собою послідовність ідентифікаторів, поділюваних точками () Протягом деякого часу текстові редактори з підтримкою Unicode ще залишатимуться рідкістю, так що в іменах пакетів, призначених для широкого розповсюдження, варто обмежуватися ASCII-символами

Вправа 52

На підставі того, що ви дізналися в цій главі (але без написання програм на Java), Визначте, які з наведених нижче виразів є невірними, а також вкажіть тип і значення вірних виразів:

3 &lt&lt&lt&lt 2L -1 (3L &lt&lt&lt&lt 2) -1

10 &lt&lt 12 == 6 &gt&gt 17

10 &lt&lt&lt&lt 12 == 6 &gt&gt&gt&gt 17

135e-1 % FloatPOSITIVE_INFINITY FloatPOSITIVE_INFINITY + DoublePOSITIVE_INFINITY DoublePOSITIVE_INFINITY + FloatPOSITIVE_INFINITY

00 / -00 == -00 / 00

IntegerMAX_VALUE + IntegerMIN_VALUE LongMAX_VALUE + 5

(short)5 * (byte)10

(i &lt&lt 15 172e3f : 0)

i + + + i + + + – i / / початкове значення i = 3

Глава 6

ПОРЯДОК ВИКОНАННЯ

– Скажіть, будь ласка, куди мені звідси йти

– Це багато в чому залежить від того, куди ти хочеш прийти

Льюїс Керролл, Аліса в Країні Чудес,

переклад Б Заходера

Програма, що складається з послідовно виконуваних операторів, безсумнівно здатна принести користь, так як оператори виконуються в тому порядку, в якому вони зустрічаються в програмі Однак можливість управляти порядком проходження операторів (тобто перевіряти деякий умова і залежно від результатів перевірки виконувати різні дії) знаменує собою якісно новий рівень в засобах розробки У цій главі розглянуті практично всі керуючі оператори, Які визначають порядок виконання програми Винятки розглянуті окремо в главі 7

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*