Философия Java | страница 67



Сдвиги можно совмещать со знаком равенства («=, или »=, или »>=). Именующее выражение заменяется им же, но с проведенными над ним операциями сдвига. Однако при этом возникает проблема с оператором беззнакового правого сдвига, совмещенного с присвоением. При использовании его с типом 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 >A j". i >A j); printBinarylntC'i « 5", i «5); printBinarylntC'i » 5", i » 5): printBinarylntC'M) » 5", (~i) » 5); printBinarylntC'i »> 5", i »> 5); printBinarylntC'M) »> 5", (~i) »> 5);