^ Исключающее ИЛИ a ^ b 1, если биты отличаются
НЕ (отрица- ние)
a Изменяет значение бита на противоположное << Сдвиг влево n << p Сдвигает биты значения n на p позиций влево >> Сдвиг вправо n >> p Сдвигает биты значения n на p позиций вправо Например, используя побитовый оператор И в двоичной арифметике, мы запишем: 53 = 00110101 & 7 = 00000111 5 = 00000101 Внимание Не путайте логический оператор И (&&) с побитовым оператором (&), а также ло- гический оператор ИЛИ (||) с побитовым оператором (|). 43 Очень распространенное применение побитовых операторов включа- ется в возможности использовать в одной переменной несколько зна- чений. Например, программа с несколькими целочисленными пере- менными (флагами), имеющими значение 1 или 0 (представляющие состояние «включено» и «выключено»), обычно требует 8 бит памяти. Эти значения требуют одного бита, однако в одной переменной можно скомбинировать до 8 флагов, используя 1 бит для каждого флага. Состо- яние каждого флага можно вызвать с помощью побитовой опе рации: 1. Создайте новую программу с именем Bitwise, содержащую стан- дартный метод main. class Bitwise { public static void main( String[] args ) { } } 2. Внутри фигурных скобок главного метода добавьте следующий код, объявляющий и инициализирующий целочисленную переменную со значением, представляющим общее состояние восьми флагов. int fs = 53 ; // Двоичное представление 00110101 3. Добавьте следующие строки для вызова состояния каждого флага. System.out.println("Флаг 1: "+(( (fs&1)>0) ? "ВКЛ" : "выкл")); System.out.println("Флаг 2: "+(( (fs&2)>0) ? "ВКЛ" : "выкл")); System.out.println("Флаг 3: "+(( (fs&4)>0) ? "ВКЛ" : "выкл")); System.out.println("Флаг 4: "+(( (fs&8)>0) ? "ВКЛ" : "выкл")); System.out.println("Флаг 5: "+(( (fs&16)>0)? "ВКЛ" : "выкл")); System.out.println("Флаг 6: "+(( (fs&32)>0)? "ВКЛ" : "выкл")); System.out.println("Флаг 7: "+(( (fs&64)>0)? "ВКЛ" : "выкл")); System.out.println("Флаг 8: "+(( (fs&128)>0)?"ВКЛ": "выкл")); 4. Сохраните программу под именем Bitwise.java, затем скомпилируй- те и запустите. JAVA Bitwise.java На заметку В данном случае побитовая операция возвращает значе- ние 1 или 0, определяющее состояние каждого флага.
2. Выполнение операций 44 Заключение • Арифметические операторы можно использовать для формирова- ния выражений с двумя операндами для сложения (+), вычитания (-), умножения (*), деления (/) и деления по модулю (%). • Операторы инкремента (++) и декремента (--) изменяют един- ственный операнд на единицу. • Оператор присваивания (=) можно комбинировать с арифметиче- скими операторами, чтобы выполнять арифметические вычисле- ния, а затем присваивать результат. • Операторы сравнения можно использовать для формирования вы- ражений, оценивающих два операнда на равенство (==), неравен- ство (!=), больше (>) или меньше (<). • Оператор присваивания может быть скомбинирован с оператора- ми > и <, и он будет возвращать значение true при равенстве опе- рандов. • Логические операторы И (&&) и ИЛИ (||) формируют выражения, оценивающие два операнда и возвращающие логические значения true или false. • Логический оператор ! возвращает обратную логическую величи- ну от значения единственного операнда. • Условный оператор ? : оценивает заданное логическое выражение и возвращает один из двух операндов в зависимости от результа- та. • При оценке логических выражений на предмет истинности можно опускать знак == true. • В сложных арифметических выражениях важно явно указывать порядок операторов с помощью добавления скобок. • Во избежание синтаксических ошибок кавычки в строковых пере- менных нужно предварять управляющим оператором \. • Управляющие последовательности \n (новая строка) и \t (табуля- ция) организуют простое форматирование вывода. • В особых ситуациях для выполнения двоичных арифметических операций полезно использовать побитовые операторы.
3 3 Создание Создание операторов операторов В данной главе В данной главе демонстрируется демонстрируется использование различных использование различных ключевых слов для ключевых слов для создания ветвлений создания ветвлений в Java-программах. в Java-программах. • Ветвление с помощью условного • Ветвление с помощью условного оператора if оператора if • Альтернативное ветвление • Альтернативное ветвление • Ветвление с помощью переключателей • Ветвление с помощью переключателей • Цикл for • Цикл for • Цикл while • Цикл while • Циклы do-while • Циклы do-while • Выход из циклов • Выход из циклов • Возврат управления • Возврат управления • Заключение • Заключение
3. Создание операторов46Ветвление с помощью условного оператора ifКлючевое слово if выполняет условную проверку, оценивая логиче- ское значение выражения. Оператор, следующий за этим выражением, будет выполняться, только если данное значение равно true (истина). В противном случае программа переходит на последующие строки кода, выполняя альтернативное ветвление. Синтаксис оператора if вы- глядит следующим образом: if ( проверочное-выражение ) код-для-исполнения-если-результат-истина ;Исполняемый код может содержать несколько операторов, при этом они образуют блок операторов и заключаются в фигурные скобки. 1. Создайте новую программу с именем If, содержащую стандартный метод main. class If{ public static void main ( String[] args) { }}2. Внутри фигурных скобок главного метода добавьте следующую простую проверку, в которой, при условии, что одно число больше другого, выполняется один оператор (в данном случае выполняет- ся вывод на печать). if ( 5 > 1 ) System.out.println( "Пять больше чем один." ) ;3. Добавьте вторую проверку, которая, при условии, что одно число меньше другого, будет выполнять блок операторов. if ( 2 < 4 ){ System.out.println( "Два меньше четырех." ) ; System.out.println( "Проверка выполнена успешно." ) ;}4. Сохраните программу под именем If.java, затем скомпилируйте и запустите. Поскольку обе проверки дадут в результате значение true, то в обоих случаях все операторы выполнятся. В проверяемом выражении может находиться сложное составное выражение. При этом проверяется несколько условий на предмет логической величины. Можно отделять скобками отдельные вы- ражения для установления порядка вычислений — выражения в скобках будут оцениваться первыми. JAVAIf.javaСовет В данном случае ключевые слова true и false опущены, поскольку проверочное выражение (2 < 4) — это краткая запись для (2 < 4 == true). 47Логический оператор И ( &&) будет возвращать true, только если оба проверяемых выражения имеют значение true: if ( ( условие-1 ) && ( условие-2 ) ) исполнить-этот-код ;Логический оператор ИЛИ ( ||) будет возвращать значение true, если хотя бы одно из проверочных выражений имеет значение true: if ( (условие-1 ) || ( условие-2) ) исполнить-этот-код ;Комбинации вышеуказанных выражений могут составлять более сложные и длинные проверочные выражения. 5. Добавьте следующую строку внутрь главного метода, для того что- бы объявить и проинициализировать целочисленную переменную с именем num. int num = 8 ;6. Добавьте третье проверочное выражение, которое будет выпол- нять оператор вывода в том случае, если значение переменной num находится внутри указанного диапазона или в точности равно ука- занному значению. if ( ( ( num > 5 ) && ( num < 10 ) ) || ( num == 12 ) ) System.out.println( "Число в диапазоне от 6 до 9 включительно или равно 12" ) ;7. Заново скомпилируйте программу и запустите ее еще раз на вы- полнение, чтобы увидеть, что оператор выполняется после про- хождения сложной проверки. 8. Измените значение, присвоенное переменной num, таким образом, чтобы оно не входило в диапазон 6–9 и не было равно 12. Ском- пилируйте заново программу и запустите ее снова, чтобы увидеть, что теперь оператор после сложной проверки не выполняется. Совет Диапазон может быть расши- рен, если включить верхние и нижние границы, исполь- зуя операторы >= и <=. На заметку В проверочном выражении используется оператор равенства ==, а не оператор присваивания =. 3. С оздание опера т оров 48 Альтернативное ветвление В дополнение к ключевому слову if можно использовать ключевое сло- во else, которое вместе с if образует оператор if else, обеспечиваю- щий альтернативные ветви для продолжения программы в соответ- ствии с результатом оценки проверочного выражения. В простейшем случае он просто предлагает альтернативный оператор для исполне- ния, а когда проверка неуспешна — выдает значение false: if ( проверочное-выражение) код-для-исполнения-если-результат-истина; else код-для-исполнения-если-результат-ложь ; Каждая альтернативная ветвь может являться либо отдельным опе- ратором, либо блоком операторов, заключенным внутри фигурных скобок . При помощи оператора if else можно строить более сложные кон- струкции для осуществления дополнительных проверок внутри каж- дой из ветвей if и else. При этом получаются вложенные операторы if . Когда программа обнаруживает выражение, оцененное как true, она исполняет операторы, связанные с этой ветвью, а затем выходит из оператора if else. 1. Создайте новую программу с именем Else, содержащую стандарт- ный метод main. class Else { public static void main ( String[] args ) { } } 2. Внутри главного метода добавьте следующую строку с объявлени- ем и инициализацией целочисленной переменной hrs. int hrs = 11 ; 3. Добавьте простое проверочное выражение, которое будет испол- нять один оператор, в случае если значение переменной hrs мень- ше 13. if ( hrs < 13 ) { System.out.println( "Доброе утро " + hrs ) ; } Внимание Обратите внимание, что первый оператор заверша- ется точкой с запятой перед ключевым словом else. JAVA Else.java
494. Сохраните программу под именем Else.java, затем скомпилируйте и запустите для просмотра исполняемого оператора. 5. Присвойте переменной hrs значение 15, а затем добавьте альтерна- тивную ветвь сразу после оператора if. else if ( hrs < 18 ){ System.out.println( "Добрый день " + hrs ) ;}6. Сохраните изменения, скомпилируйте и запустите заново програм- му, чтобы увидеть, что исполняется альтернативный оператор. Иногда полезно ставить последнюю ветвь else без вложенного оператора if, чтобы определить оператор по умолчанию, выпол- няемый в случае, если никакое проверочное выражение не будет истинно. 7. Присвойте переменной hrs значение 21, затем добавьте следующую ветвь, заданную по умолчанию, в конец оператора if else. else System.out.println( "Добрый вечер: " + hrs ) ;8. Сохраните изменения, перекомпилируйте и запустите программу еще раз, чтобы увидеть, что выполняется оператор, заданный по умолчанию. На заметку Условное ветвление — это фундаментальный процесс, с помощью которого ком- пьютер выполняет про- граммы. 3. Создание операторов50Ветвление с помощью переключателейКонструкции с операторами if else, предлагающими большое коли- чество условных ветвлений программы, могут стать довольно громозд- кими. В тех случаях, где нужно повторять проверку одного и того же значения переменной, более элегантное решение предлагает оператор switch (переключатель ). Типичный синтаксис блока оператора switch выглядит следующим образом: switch ( проверяемая-переменная ){ case значение-1 : код-для-исполнения-если-истина ; break ; case значение-2 : код-для-исполнения-если-истина ; break ; case значение-3 : код-для-исполнения-если-истина ; break ; default : код-для-исполнения-если-ложь;}Оператор switch работает довольно необычно. Он проверяет значе- ния, указанные переменной, на соответствие значениям своих опций case, а затем выполняет оператор, связанный со значением определен- ной опции. Последняя опция default является необязательной и может добав- ляться в оператор switch для указания операторов, которые будут ис- полняться в том случае, если ни одно из указанных значений не соот- ветствует проверяемой переменной. Каждая опция оператора начинается с ключевого слова case и значе- ния для проверки, для которого стоит символ двоеточия и операторы, исполняемые в случае соответствия значению. Важно помнить, что оператор и блок операторов, связанный с опреде- ленной опцией case, должны завершаться ключевым словом break. В противном случае программа будет продолжать исполнять операто- ры другой опцией case после той, которая прошла проверку. Иногда это и полезно, чтобы указать несколько опций case, для которых нуж- но исполнить один и тот же блок операторов. Например, один оператор для каждой из трех опций выглядит следующим образом: switch ( проверяемая-переменная ){ case значение-1 : case значение-2 : case значение-3 : код-А-для-исполнения-если-истина ; break ;Внимание Отсутствие ключевого слова break не является синтакси- ческой ошибкой, поэтому, во избежание неожиданных для вас результатов, вы должны убедиться, что все операторы break проставле- ны там, где это необходимо. 51 case значение-4 : case значение-5 : case значение-6 : код-B-для-исполнения-если-истина ; break ;}1. Создайте новую программу с именем Switch, содержащую стан- дартный метод main. class Switch{ public static void main ( String[] args ) { }}2. Внутри главного метода добавьте объявление и инициализацию трех целочисленных переменных. int month = 2, year = 2016, num = 31 ;3. Добавьте блок оператора switch для проверки значений, присвоен- ных переменной month. switch ( month ){}4. Внутри блока switch добавьте опции case, присваивая новые зна- чения переменной num для месяцев 4, 6, 9 и 11. case 4 : case 6 : case 9 : case 11 : num = 30 ; break ;5. Добавьте опцию case с присваиванием нового значения перемен- ной num для месяца 2 в соответствии со значением переменной yearcase 2 : num = ( year % 4 == 0 ) ? 29 : 28 ; break ;6. После блока switch в конце главного метода добавьте следующую строку для вывода всех трех значений переменных. System.out.println( month+"/"+year+": "+num+"дней" ) ;7. Сохраните программу под именем Switch.java, затем скомпилируй- те и запустите. JAVASwitch.javaСовет Обратите внимание, что все три целочисленные пере- менные объявлены и про- инициализированы в одной строке, причем использова- но удобное сокращение. На заметку На шаге 5 используется условный оператор для эф- фективной проверки. Чтобы вспомнить, как он работает, можете вернуться к главе 2. 3. Создание операторов52Цикл forЦиклом называется блок кода , в котором с определенной периодич- ностью исполняются содержащиеся в нем операторы до тех пор, пока не выполнится определенное условие; затем цикл завершается, и про- грамма переходит к своей следующей задаче. Наиболее часто используемая структура циклов в программировании на Java использует ключевое слово for, и синтаксис данной структуры следующий: for ( инициализация ; проверочное-выражение ; итерация |