Логические операции
В языке Java реализованы четыре логические операции:
□ отрицание (NOT) — ! (обозначается восклицательным знаком);
□ конъюнкция (AND) — & (амперсанд);
□ дизъюнкция (OR) — | (вертикальная черта);
□ исключающее ИЛИ (XOR) — л(каре).
Они выполняются над логическими данными типа boolean, их результатом будет тоже логическое значение — true или false. Про эти операции можно ничего не знать, кроме того, что представлено в табл. 1.1.
Таблица 1.1. Логические операции |
b1 |
b2 |
!b1 |
b1 & b2 |
b1 | b2 |
b1 лb2 |
true |
true |
false |
true |
true |
false |
true |
false |
false |
false |
true |
true |
false |
true |
true |
false |
true |
true |
false |
false |
true |
false |
false |
false |
Словами эти правила можно выразить так:
□ отрицание меняет значение истинности;
□ конъюнкция истинна, только если оба операнда истинны;
□ дизъюнкция ложна, только если оба операнда ложны;
□ исключающее ИЛИ истинно, только если значения операндов различны.
ЗАМЕЧАНиЕ
Если бы Шекспир был программистом, фразу "To be or not to be" он написал бы так:
2b | ! 2b.
Кроме перечисленных четырех логических операций есть еще две логические операции сокращенного вычисления:
□ сокращенная конъюнкция (conditional-AND) — &&
□ сокращенная дизъюнкция (conditional-OR) — | |.
Удвоенные знаки амперсанда и вертикальной черты следует записывать без пробелов.
Правый операнд сокращенных операций вычисляется только в том случае, если от него зависит результат операции, т. е. если левый операнд конъюнкции имеет значение true или левый операнд дизъюнкции имеет значение false.
Это правило очень удобно и довольно ловко используется программистами, например можно записывать выражения (n != 0) && (m/n > 0.001) или (n == 0) | | (m/n > 0.001), не опасаясь деления на нуль.
ЗАМЕЧАНиЕ
Практически всегда в Java используются именно сокращенные логические операции.
Упражнения
1. Для переменных b и bb, определенных в разд. "Логический тип" данной главы, найдите значение выражения b & bb && !bb | b.
2. При тех же определениях вычислите выражение (!b || bb) && (bb Лb).
Целые типы
Спецификация языка Java, JLS, определяет разрядность (количество байтов, выделяемых для хранения значений типа в оперативной памяти) каждого типа. Для целых типов она приведена в табл. 1.2. В таблице указан также диапазон значений каждого типа, получаемый на процессорах архитектуры Pentium.
Таблица 1.2. Целые типы |
Тип |
Разрядность(байт) |
Диапазон |
byte |
1 |
От -128 до 127 |
short |
2 |
От -32 768 до 32 767 |
int |
4 |
От -2 147 483 648 до 2 147 483 647 |
long |
8 |
От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
char |
2 |
От ’\u0000 ’ до ’ \uFFFF’, в десятичной форме от 0 до 65 535 |
Хотя тип char занимает два байта, в арифметических вычислениях он участвует как тип int, ему выделяется 4 байта, два старших байта заполняются нулями.
Вот примеры определения переменных целых типов:
byte b1 = 50, b2 = -99, b3; short det = 0, ind = 1, sh = ’d’;
int i = -100, j = 100, k = 9999;
long big = 50, veryBig = 2147483648L;
char c1 = 'A', c2 = '?', c3 = 36, newLine = '\n';
Целые типы, кроме char, хранятся в двоичном виде с дополнительным кодом. Последнее означает, что для отрицательных чисел хранится не их двоичное представление, а дополнительный код этого двоичного представления.
Дополнительный код получается так: в двоичном представлении числа все нули меняются на единицы, а единицы на нули, после чего к результату прибавляется единица, разумеется, в двоичной арифметике.
Например, значение 50 переменной b1, определенной ранее, будет храниться в одном байте с содержимым 00110010, а значение -99 переменной b2 — в байте с содержимым, которое вычисляется так: число 99 переводится в двоичную форму, получая 01100011, меняются единицы и нули, получая 10011100, и прибавляется единица, получая окончательно байт с содержимым 10011101.
Смысл всех этих преобразований в том, что сложение числа с его дополнительным кодом в двоичной арифметике даст в результате нуль; старший бит, равный 1, просто теряется, поскольку выходит за разрядную сетку. Это означает, что в такой странной арифметике дополнительный код числа является противоположным к нему числом, числом с обратным знаком. А это, в свою очередь, означает, что вместо того, чтобы вычесть из числа A число B, можно к A прибавить дополнительный код числа B. Таким образом, операция вычитания исключается из набора машинных операций.
Читать дальше
Конец ознакомительного отрывка
Купить книгу