Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

int x=1;

x>0 // выражение истинно

!(x>0) // выражение ложно

Оператор с условием ?: состоит из трех частей – условия и двух выражений. Сначала вычисляется условие (булевское выражение), а на основании результата значение всего оператора определяется первым выражением в случае получения истины и вторым – если условие ложно. Например, так можно вычислить модуль числа x:

x>0 ? x : -x

Битовые

операции

Прежде чем переходить к битовым операциям, необходимо уточнить, каким именно образом целые числа представляются в двоичном виде. Конечно, для неотрицательных величин это практически очевидно:

0 0

1 1

2 10

3 11

4 100

5 101

и так далее. Однако как представляются отрицательные числа? Во-первых, вводят понятие знакового бита. Первый бит начинает отвечать за знак, а именно 0 означает положительное число, 1 – отрицательное. Но не следует думать, что остальные биты остаются неизменными. Например, если рассмотреть 8-битовое представление:

– 1 10000001 // это НЕВЕРНО!

– 2 10000010 // это НЕВЕРНО!

– 3 10000011 // это НЕВЕРНО!

Такой подход неверен! В частности, мы получаем сразу два представления нуля – 00000000 и 100000000, что нерационально. Правильный алгоритм можно представить себе так. Чтобы получить значение -1, надо из 0 вычесть 1:

00000000

– 00000001

– -----------

– 11111111

Итак, -1 в двоичном виде представляется как 11111111. Продолжаем применять тот же алгоритм (вычитаем 1):

0 00000000

– 1 11111111

– 2 11111110

– 3 11111101

и так далее до значения 10000000, которое представляет собой наибольшее по модулю отрицательное число. Для 8-битового представления наибольшее положительное число 01111111 (=127), а наименьшее отрицательное 10000000 (=-128). Поскольку всего 8 бит определяет 28=256 значений, причем одно из них отводится для нуля, то становится ясно, почему наибольшие по модулю положительные и отрицательные значения различаются на единицу, а не совпадают.

Как известно, битовые операции "и", "или", "исключающее или" принимают два аргумента и выполняют логическое действие попарно над соответствующими битами аргументов. При этом используются те же обозначения, что и для логических операторов, но, конечно, только в первом (одиночном) варианте. Например, вычислим выражение 5&6:

00000101

& 00000110

– ------------

00000100 // число 5 в двоичном виде

// число 6 в двоичном виде

//проделали операцию "и"

попарно над битами

// в каждой позиции

То есть выражение 5&6 равно 4.

Исключение составляет лишь оператор "не" или "NOT", который для побитовых операций записывается как (для логических было !). Этот оператор меняет каждый бит в числе на противоположный. Например, (-1)=0 . Можно легко установить общее правило для получения битового представления отрицательных чисел:

Если n – целое положительное число, то -n в битовом представлении равняется (n-1).

Наконец, осталось рассмотреть лишь операторы побитового сдвига. В Java есть один оператор сдвига влево и два варианта сдвига вправо. Такое различие связано с наличием знакового бита.

При сдвиге влево оператором << все биты числа смещаются на указанное количество позиций влево, причем освободившиеся справа позиции заполняются нулями. Эта операция аналогична умножению на 2n и действует вполне предсказуемо, как при положительных, так и при отрицательных аргументах.

Рассмотрим примеры применения операторов сдвига для значений типа int, т.е. 32-битных чисел. Пусть положительным аргументом будет число 20, а отрицательным -21.

// Сдвиг влево для положительного числа 20

20 << 00 = 00000000000000000000000000010100 = 20

20 << 01 = 00000000000000000000000000101000 = 40

20 << 02 = 00000000000000000000000001010000 = 80

20 << 03 = 00000000000000000000000010100000 = 160

20 << 04 = 00000000000000000000000101000000 = 320

...

20 << 25 = 00101000000000000000000000000000 = 671088640

20 << 26 = 01010000000000000000000000000000 = 1342177280

20 << 27 = 10100000000000000000000000000000 = -1610612736

20 << 28 = 01000000000000000000000000000000 = 1073741824

20 << 29 = 10000000000000000000000000000000 = -2147483648

20 << 30 = 00000000000000000000000000000000 = 0

20 << 31 = 00000000000000000000000000000000 = 0

// Сдвиг влево для отрицательного числа -21

– 21 << 00 = 11111111111111111111111111101011 = -21

– 21 << 01 = 11111111111111111111111111010110 = -42

– 21 << 02 = 11111111111111111111111110101100 = -84

– 21 << 03 = 11111111111111111111111101011000 = -168

– 21 << 04 = 11111111111111111111111010110000 = -336

– 21 << 05 = 11111111111111111111110101100000 = -672

...

– 21 << 25 = 11010110000000000000000000000000 = -704643072

– 21 << 26 = 10101100000000000000000000000000 = -1409286144

– 21 << 27 = 01011000000000000000000000000000 = 1476395008

– 21 << 28 = 10110000000000000000000000000000 = -1342177280

Поделиться:
Популярные книги

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Газлайтер. Том 31

Бригадир

Вязовский Алексей
1. Бригадир
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Бригадир

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Я Гордый часть 7

Машуков Тимур
7. Стальные яйца
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Я Гордый часть 7

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Гимн Непокорности

Злобин Михаил
2. Хроники геноцида
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Гимн Непокорности

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Восхождение Примарха

Дубов Дмитрий
1. Восхождение Примарха
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Восхождение Примарха

Марш обреченных

Злобин Михаил
1. Хроники геноцида
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Марш обреченных

Газлайтер. Том 26

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 26

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Кодекс Охотника. Книга XXIX

Винокуров Юрий
29. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXIX