×
Traktatov.net » Философия Java » Читать онлайн
Страница 54 из 395 Настройки
: при положительном значении новые биты заполняются нулями, а при отрицательном — единицами. В Java также поддерживается беззнаковый сдвиг вправо »>, использующий заполнение нулями: независимо от знака старшие биты заполняются нулями. Такой оператор не имеет аналогов в С и С++.

Если сдвигаемое значение относится к типу char, byte или short, эти типы приводятся к int перед выполнением сдвига, и результат также получится int. При этом используется только пять младших битов с «правой» стороны. Таким образом, нельзя сдвинуть битов больше, чем вообще существует для целого числа int. Если вы проводите операции с числами long, то получите результаты типа long. При этом будет задействовано только шесть младших битов с «правой» стороны, что предотвращает использование излишнего числа битов.

Сдвиги можно совмещать со знаком равенства («=, или »=, или »>=). Именующее выражение заменяется им же, но с проведенными над ним операциями сдвига. Однако при этом возникает проблема с оператором беззнакового правого сдвига, совмещенного с присвоением. При использовании его с типом byte или short вы не получите правильных результатов. Вместо этого они сначала будут преобразованы к типу int и сдвинуты вправо, а затем обрезаны при возвращении к исходному типу, и результатом станет -1. Следующий пример демонстрирует это:

//: operators/URShi ft java // Проверка беззнакового сдвига вправо, import static net.mindview.util Print *;

public class URShift {

public static void main(String[] args) { int i = -1;

print(Integer.toBinaryString(i)); i »>= 10;

print(Integer.toBinaryString(i)), long 1 = -1;

print(Long.toBinaryString(l)); 1 »>= 10;

print(Long.toBinaryString(l)); short s = -1;

printdnteger toBinaryString(s)); s »>= 10;

pri nt(Integer.toBi na ryStri ng(s)), byte b = -1;

printdnteger toBinaryString(b)); b »>= 10;

pri nt(Integer.toBi na ryString(b)); b = -1;

pri nt(Integer.toBi na rySt ring(b)), pri nt (I nteger. toBi narySt ri ng( b»>10));

}

} /* Output; 11111111111111111111111111111111 1111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 1111111111111111111111

В последней команде программы полученное значение не приводится обратно к Ь, поэтому получается верное действие.

Следующий пример демонстрирует использование всех операторов, так или иначе связанных с поразрядными операциями:

//; operators/BitManipulation.java // Использование поразрядных операторов, import java.util.*;

import static net.mindview.util Print.*;

public class BitManipulation {

public static void main(String[] args) { Random rand = new Random(47);

int i = rand nextlntO, int j = rand.nextlntO. printBinarylntC'-l", -1); printBinarylntC'+l", +1); int maxpos = 2147483647; printBinaryInt("макс положит.", maxpos); int maxneg = -2147483648; printBinarylntC'MaKc отрицат.". maxneg); printBinarylntC'i". i); printBinaryInt("~i", ~i); printBinaryInt("-i", -i); printBinarylntC'j", j), printBinarylntC'i & j". i & j), printBinarylntC'i | j", i | j); printBinarylntC'i