
- •Глава 2
- •Глава 2. Обзор языка Java 31_
- •Глава 2. Обзор языка Java
- •Глава 2. Обзор языка Java 37
- •Глава 2. Обзор языка Java 39
- •Глава 2. Обзор языка Java 41
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 43_
- •Глава 2. Обзор языка Java 45_
- •Глава 2. Обзор языка Java 47
- •Глава 2. Обзор языка Java 49_
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 57
- •Глава 3
- •Глава 3. Типы данных, переменные и массивы 53
- •Глава 3. Типы данных, переменные и массивы _ 55
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 59_
- •Глава 3. Типы данных, переменные и массивы 61_
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 65_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 67_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 69_
- •Глава 3. Типы данных, переменные и массивы 71_
- •Глава 3. Типы данных, переменные и массивы 73_
- •Глава 3. Типы данных, переменные и массивы
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы _ 77_ Эта программа генерирует следующий вывод:
- •Глава 3. Типы данных, переменные и массивы 79
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 81_
- •Глава 4
- •Глава 4. Операции 83
- •84 Часть I. Язык Java
- •Глава 4. Операции 85_
- •Глава 4. Операции 87_
- •88_ Часть I. Язык Java
- •Глава 4. Операции 89
- •Глава 4. Операции 91_
- •Глава 4. Операции 93_
- •Глава 4. Операции 95_
- •Глава 4. Операции 97_
- •Глава 4. Операции 99
- •Глава 4. Операции 101
- •Глава 4. Операции 103
- •104 Часть I, Язык Java
- •Глава 4. Операции 105
- •Глава 5
- •Глава 5, Управляющие операторы 107
- •Глава 5. Управляющие операторы 109
- •110 Часть I. Язык Java
- •Глава 5, Управляющие операторы 111
- •Глава 5. Управляющие операторы 113
- •Глава 5. Управляющие операторы
- •Глава 5. Управляющие операторы 117
- •118 Часть I. Язык Java
- •Глава 5. Управляющие операторы 119
- •Глава 5. Управляющие операторы 121
- •122 Часть I. Язык Java
- •Глава 5. Управляющие операторы 123
- •Глава 5. Управляющие операторы 125
- •Глава 5. Управляющие операторы 127
- •Глава 5. Управляющие операторы 129
- •Глава 5. Управляющие операторы
- •Глава 6
- •134 Часть I. Язык Java
- •Глава 6. Введение в классы 135
- •136 Часть I. Язык Java
- •Глава 6. Введение в классы _ 137
- •Глава 6. Введение в классы 139
- •Глава 6. Введение в классы
- •Глава 6. Введение в классы 143
- •Глава 6. Введение в классы 145
- •Глава 6. Введение в классы 147
- •Глава 6. Введение в классы 149
- •Глава 6. Введение в классы 151
- •154 Часть I. Язык Java
- •Глава 6. Введение в классы 155
- •Глава 6. Введение в классы 157
- •Глава 7
- •Глава 7. Методы и классы 159
- •Глава 7. Методы и классы . 161
- •Глава 7. Методы и классы • 163
- •164 Часть I. Язык Java
- •Глава 7. Методы и классы 165
- •Глава 7. Методы и классы 167
- •Глава 7. Методы и классы 169
- •Глава 7, Методы и классы 171-
- •Глава 7. Методы и классы 173
- •Глава 7. Методы и классы 775
- •Глава 7. Методы и классы 177
- •Глава 7. Методы и классы ' 179
- •Глава 7. Методы и классы 1_81_
- •Глава 7. Методы и классы 1_83
- •184 '• Часть I. Язык Java
- •Глава 7. Методы и классы . 185
- •Глава 7. Методы и классы 187
- •Глава 8
- •Глава 8. Наследование 191
- •Глава 8. Наследование 193
- •Глава 8, Наследование 195
- •Глава 8. Наследование 197
- •198 Часть I. Язык Java
- •Глава 8, Наследование 199
- •Глава 8. Наследование 201
- •202 Часть I. Язык Java
- •Глава 8. Наследование 203
- •Глава 8. Наследование 205
- •Глава 8. Наследование 207
- •Глава 8. Наследование 209
- •Глава 8. Наследование 211
- •Глава 8. Наследование 213
- •Глава 8. Наследование 215
- •Глава 8. Наследование 217
- •Глава 12
- •Глава 12. Ввод/вывод, апплеты и другие темы 303_
- •Глава 12. Ввод/вывод, апплеты и другие темы . 305
- •Глава 12. Ввод/вывод, алплеты и другие темы 307
- •Глава 12. Ввод/вывод, апплеты и другие темы 309
- •Глава 12. Ввод/вывод, апплеты и другие темы 311
- •Глава 12. Ввод/вывод, апплаты и другие темы 313
- •314 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 315
- •Глава 12. Ввод/вывод, апплеты и другие темы 317
- •Глава 12. Ввод/вывод, апплеты и другие темы 319
- •320 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 321
- •Глава 12. Ввод/вывод, апплеты и другие темы 323
- •324 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 325
- •326 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплегы и другие темы 327
Глава 4. Операции 95_
Когда значение имеет биты, которые "выдвигаются" (в данном случае — вправо), такие биты теряются. Например, следующий кодовый фрагмент сдвигает значение 35 вправо на две позиции, что приводит к потере двух младших битов, заканчиваясь снова установкой значения 8.
int a = 35;
а = а » 2; // снова содержит 8
Взгляд на ту же операцию в двоичном представлении яснее показывает, как это происходит:
00100011 (35)
» 2
00001000 (8)
Каждый раз, когда вы сдвигаете значение вправо, оно делится на два и отбрасывает любой остаток. Этим можно воспользоваться для высокоэффективного целочисленного деления на 2. Конечно, вы должны убедиться, что не выдвигаете никакие биты с правого конца.
При сдвиге вправо старшие (крайние левые) биты освобождаются и заполняются предыдущим содержимым старшего (знакового) бита. Это так называемое расширение знака. Оно служит для того, чтобы сохранить знак отрицательных чисел, когда вы сдвигаете их вправо. Например, —8 ».1 дает —4, что в двоичной форме выглядит так:
11111000 (-8)
»1
11111100 (-4)
Интересно обратить внимание, что, если вы сдвигаете —1 вправо, результат всегда остается — 1, так как расширение знака продолжает вводить все больше единиц в старшие биты.
Иногда расширение знака при сдвиге значений вправо не желательно. Например, следующая программа преобразует byte-значение к его шестнад-цатеричному строчному представлению. Заметим, что сдвинутое значение маскируется выполнением операции (Ь » 4) & OxOf, чтобы отказаться от любых расширенных знаком битов (это делается для того, чтобы значение могло использоваться как индекс в массиве шестнадцатеричных символов).
// Маскировка расширения знака, class HexByte {
static public void main(String args[]} { char hex[] = {
I [Л I I -] I 10? I Q I ? Л I IRI I fLI I -7 I
U , L , Z, О / Ч, Э , . О / /,
'8', '9', 'a1, 'b', 'c', 'd', '&', 'f }; byte b = (byte) Oxfl;
96 Часть
I.
Язык Java
System.out.println("b
= Ox"
+ hex[(b
» 4) & OxOf]
+ hex[b
& OxOf]);
}
}
Вывод этой
программы:
b
= Oxfl
b = Oxfl
Правый сдвиг без знака
Как вы только что видели, операция » автоматически наполняет старший бит его предыдущим содержанием каждый раз, когда происходит сдвиг. Это сохраняет знак числа. Правда, иногда это не желательно. Например, если вы сдвигаете что-то, что не представляет числового значения, вы можете не хотеть расширения знака. Эта ситуация обычно имеет место, когда вы работаете с пикселными значениями и графикой. В этих случаях вы вообще захотите поместить нуль в старший бит, независимо от того, каково было его начальное значение. Такая процедура известна как беззнаковый сдвиг. Чтобы выполнить ее, нужно использовать Java-операцию беззнакового сдвига вправо >», которая всегда вставляет нуль в старший бит.
Следующий кодовый фрагмент демонстрирует операцию >». Здесь переменная а установлена в — 1, что устанавливает все 32 бита ее двоичного представления в 1. Затем это значение сдвигается вправо на 24 бита, заполняя 24 верхних бита нулями и игнорируя нормальное расширение знака. Это устанавливает в а значение 255.
int a = -1; а = а >» 24;
Чтобы проиллюстрировать, что происходит, ниже показана та же операция в двоичной форме:
11111111 11111111 11111111 11111111 (-1 в двоичной форме типа int)
>»24
00000000 00000000 00000000 11111111 (255 в двоичной форме типа int)
Операция >» часто не столь полезна, как вам бы хотелось, т. к. она значима только для 32- и 64-разрядных значений. Напомним, что меньшие значения в выражениях автоматически расширяются до int. Это означает, что происходит расширение знака, и что сдвиг будет иметь место скорее на 32-разрядном, чем на 8- или 16-разрядном значении. То есть, можно ожидать, что беззнаковый правый сдвиг на byte-значении заполнит нулем все разряды, начиная с седьмого. Но дело обстоит не так, поскольку фактически сдвигается 32-разрядное значение. Следующая программа демонстрирует этот эффект: