Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Поразрядные операторы

Читайте также:
  1. Вопрос 14 Потеря и восстановление информации о типе. Операторы is и as.
  2. Лаговые операторы
  3. ЛИНЕЙНЫЕ ОТОБРАЖЕНИЯ И ОПЕРАТОРЫ
  4. Логические операторы
  5. Операторы Stop, End и Exit Sub
  6. Операторы и агенты
  7. Операторы и структура кода. Управление ходом выполнения программы.

Иногда приходится изменять значения отдельных битов в целых данных. Это выполняется с помощью побитовых (bitwise) операций путем наложения маски.

В языке Java есть четыре побитовых оператора:

• дополнение (complement) ~ (тильда);

• побитовая конъюнкция (bitwise AND) &;

• побитовая дизъюнкция (bitwise OR) |;

• побитовое исключающее ИЛИ (bitwise XOR) ^.

Они выполняются поразрядно, после того как оба операнда будут приведены к одному типу int или long, так же как и для арифметических операций, а значит, и к одной разрядности. Операции над каждой парой битов выполняются согласно следующей таблице:

b1 b2 !b1 b1&b2 b1|b2 b1^b2
           
           
           
           

 

byte b1 = 50; // двоичное представление 00110010

byte b2 = -99; //двоичное представление 10011101

int r1, r2, r3, r4;

//Перед операцией происходит повышение до типа int.

//Получаем представления из 32-х разрядов для b1 — 0...00110010,

//для b2 — 1...l0011101.

r1 = ~b2; // == 98, двоичное представление 0...01100010;

r2 = b1 & b2; // == 16, двоичное представление 0...00010000;

r3 = b1 | b2; // == -65, двоичное представление 1...10111111;

r4 = b1 ^ b2; //== -81, двоичное представление 1...10101111.

System.out.println("r1="+r1);

System.out.println("r2="+r2);

System.out.println("r3="+r3);

System.out.println("r4="+r4);

На следующем рисунке показано, как это выглядит в окне Command Prompt.

Двоичное представление каждого результата занимает 32 бита.

Заметьте, что дополнение ~х всегда эквивалентно (-x)-1.

Сдвиги

В языке Java есть три оператора сдвига двоичных разрядов:

• сдвиг влево <<;

• сдвиг вправо >>;

• беззнаковый сдвиг вправо >>>.

Эти операции своеобразны тем, что левый и правый операнды в них имеют разный смысл.

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

Например, операция b1 << 2 сдвинет влево на 2 разряда предварительно повышенное значение 0...00110010 переменной b1, что даст в результате 0...011001000, десятичное 200. Освободившиеся справа разряды заполняются нулями, левые разряды, находящиеся за 32-м битом, теряются.

Операция b2 << 2 сдвинет повышенное значение 1...10011101 на два разряда влево. В результате получим 1...1001110100, десятичное значение —396.

n1 = b1 << 2;

n2 = b2 << 2;

System.out.println("n1="+n1);

System.out.println("n2="+n2);

На следующем рисунке показано, как это выглядит в окне Command Prompt.

Заметьте, что сдвиг влево на n разрядов эквивалентен умножению числа на 2 в степени n.

Операция >> означает в языке Java сдвиг вправо. Он перемещает все биты своего левого операнда вправо на число позиций, заданное правым операндом. Когда биты левого операнда выдвигаются за самую правую позицию слова, они теряются. При сдвиге вправо освобождающиеся старшие (левые) разряды сдвигаемого числа заполняются предыдущим содержимым знакового разряда. Такое поведение называют расширением знакового разряда.

n1 = b1 >> 2; //слева распространяется старший бит,

n2 = b2 >> 2; //правые биты теряются.

System.out.println("n1="+n1);

System.out.println("n2="+n2);

На следующем рисунке показано, как это выглядит в окне Command Prompt.

Часто требуется, чтобы при сдвиге вправо расширение знакового разряда не происходило, а освобождающиеся левые разряды просто заполнялись бы нулями. Будьте осторожны при использовании сдвигов вправо.

Операция беззнакового сдвига во всех случаях ставит слева на освободившиеся места нули, осуществляя логический сдвиг. Но вследствие предварительного повышения это имеет эффект только для нескольких старших разрядов отрицательных чисел.

Так, b2 >>> 2 имеет результатом 001...100111, десятичное число 1 073 741 799. Если же мы хотим получить логический сдвиг исходного значения 10011101 переменной b2, т. е., 0...00100111, надо предварительно наложить на b2 маску, обнулив старшие биты: (b2 & 0XFF) >>> 2.

n3 = b2 >>> 2;

System.out.println("n3=" + n3);

n4 = (b2 & 0XFF) >>> 2;

System.out.println("n4=" + n4);

На следующем рисунке показано, как это выглядит в окне Command Prompt.


Дата добавления: 2015-10-29; просмотров: 138 | Нарушение авторских прав


Читайте в этой же книге: Что такое Java | Мобильность Java | Выполнение Java-программы | Borland JBuilder 9 | Oracle9i JDeveloper и Oracle9i Developer Suite | Java в Internet | Первая программа на языке Java | Синтаксис языка | Типы данных языка Java | Операторы цикла do-while, while, for |
<== предыдущая страница | следующая страница ==>
Вещественный тип данных| Троичный оператор

mybiblioteka.su - 2015-2024 год. (0.006 сек.)