Главная » Java » Операторы побитовой арифметики Java

0

В Java поддерживаются следующие бинарные операторы побитовой арифметики.

 

Оператор                                 Описание

&                                        Побитовое И

|                                        Побитовое включающее ИЛИ

^                                        Побитовое исключающее ИЛИ

Операторы побитовой арифметики применимы только к аргументам целочисленных типов (включая char) и выполняются по отношению к парам их одноименных БИТОВ. Оператор &, побитовое И (AND) , дает в результате вычислений единицу (1), если оба бита содержат 1; оператор 1, побитовое включающее ИЛИ (OR), возвращает 1, если хотя бы один из битов равен 1; наконец, оператор Л, побитовое исключающее ИЛИ (XOR), предполагает получение 1 только в том случае, если биты содержат различные значения. Рассмотрим следующие примеры:

0XF00F & 0x0FF0 равняется 0х0000 0xF00F I 0x0FF0 равняется 0xffff 0хАААА & 0xFFFF равняется 0х5555

Существует только один унарный побитовый оператор – оператор побитового дополнения, ~, – который преобразует значение каждого бита на противоположное. Так, например, целому числу 0х00003333 после применения оператора ~ будет соответствовать результат 0XFFFFCCCC.

Хотя логические и побитовые операторы обозначаются одними и теми же символами, они совершенно различны по назначению. Смысл символа &, обозначающего операторы логического И и побитового И, например, определяется контекстом выражения. Поскольку логические операторы применимы только к булевым аргументам, а побитовые операторы – только к целочисленным, выражение, в котором одновременно используются операнды различных типов, как, скажем, true & 0хАААА , на этапе компиляции трактуется как ошибочное.

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

 

Оператор                                 Описание

<<                                       Сдвиг битов влево с заполнением позиций справа нулями

>>                                             Сдвиг битов вправо с заполнением позиций слева значением старшего (знакового) бита

     

>>>                                            Сдвиг битов вправо с заполнением позиций слева нулями                                   

 

 

В левой части оператора побитового сдвига указывается число, подлежащее обработке, а в правой – количество сдвигаемых битов. Например, при вычислении выражения var >>> 2 биты целого числа, хранящегося в var, сдвигаются на две позиции вправо; при этом исходное содержимое младших (правых) разрядов теряется, а старшие (левые) разряды заполняются нулями.

Операторы сдвига вправо выполняют арифметический сдвиг (>>) и логический сдвиг (>>>). При арифметическом сдвиге знак исходного числа сохраняется посредством заполнения старших (левых) разрядов числа значением знакового бита (нулем, если число положительно, и единицей, если отрицательно.Прим. перев.). Операция логического сдвига предполагает заполнение старших разрядов числа нулями. Ее часто используют для извлечения подмножеств битов Числа. Например, в двоично-десятичной системе счисления (binary coded decimal – BCD) каждый десятичный разряд числа представляется четверкой битов (допустимые значения принадлежат интервалу от 0х00 до 0х09 – остальные Битовые маски считаются неверными), поэтому два десятичных разряда могут быть описаны одним байтом. Чтобы извлечь из байта младший десятичный разряд, достаточно применить по отношению к байту оператор побитового И с аргументом 0x0F, обнулив таким образом все биты старшего десятичного разряда. Чтобы, напротив, извлечь из байта старший десятичный разряд, удобно воспользоваться оператором логического сдвига вправо (>>>), который перемещает требуемые биты числа вправо, заполняя их прежние позиции нулями:

class BCD {

static int getBCDLowoigit(byte val) {

// извлечение младшего десятичного разряда return (val & 0x0F);

}

static int getBCDHighoigit(byte val) {

// извлечение старшего десятичного разряда return (val >>> 4);

}

}

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

Если указанное число сдвигаемых разрядов отрицательно либо превышает количество битов в аргументе, фактическая величина сдвига отличается от ожидаемой и вычисляется по следующему правилу: к заданному значению сдвига применяется операция побитового И с маской, равной количеству битов в значении длины соответствующего типа за вычетом единицы. Например, для 32битового типа int используется маска 0x1F (31), поэтому, например, оба выражения, n << 35 и n << -29, будут сведены, в соответствии с упомянутым правилом, к n << 3.

Операторы побитового сдвига применяются только по отношению к целым числам. В тех редких обстоятельствах, когда действительно необходимо выполнить подобные операции над числами с плавающей запятой, можно воспользоваться соответствующими методами преобразования, объявленными в классах-оболочках Float и Double (подробнее об этом – в разделе 11.1.6 на странице 296).

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии