『Javaプログラミング思想』学習ノートのオペレータ

1720 ワード

char、byte、shortタイプの数値をシフト処理すると、シフトが行われる前にintタイプに変換され、結果もintタイプの値となる.数値右端の低い5桁だけが役に立ちます.これにより、int型値が有するビット数を超えるシフトを防止することができる.(注:2の5次は32であるが、int型の値は32ビットしかない.)
ここで、5桁低い値とは、オペレータ右端シフト数の5桁低い値を指す.int型の値は32ビットしかないので、32ビット以上移動するとシフトすべき数が完全に変わります.したがってJavaでは5ビットだけ低くし,シフト数を0から31の間に制限する.a>>33はa>>1に等しい.
「シフト」は、等号(<<=または>>=または>>>=)と組み合わせて使用できます.この場合、オペレータの左の値は右の値で指定されたビット数を移動し、結果を左の変数に割り当てます.しかし、「符号なし」右シフト結合付与操作を行う場合、byteまたはshort値に対してこのようなシフト演算を行うと、正しい結果が得られない可能性があるという問題が発生する可能性があります.これらはintタイプに変換されてから右に移動し、その後切断され、元のタイプに割り当てられ、この場合-1の結果が得られる可能性があります.
public class URShift {
    public static void main(String[] args) {
        byte b1 = -1;
        byte b2 = -1;
        System.out.println(Integer.toBinaryString(b1));
        System.out.println(Integer.toBinaryString(b2));
        b1 >>>= 10;
        b2 >>>= 25;
        System.out.println(Integer.toBinaryString(b1));
        System.out.println(Integer.toBinaryString(b2));
    }
} /* Output:
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
1111111

b 1=−1については、まずintタイプの−1に変換され、そのバイナリが11111111111111111111111111111として表され、さらに10ビットシフト操作が行われ、00000000 0011111111111111111111111111111111111111が得られ、その後8ビットに切断されたbyteタイプ11111111111が得られ、結果b 1=−1となり、これをintタイプのバイナリ列に変換した結果、11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111となった.
b 2=−1については、まずintタイプの−1に変換され、そのバイナリ表現は11111111111111111111111111111、11111111111、11111、11111、11111となり、さらに右シフト25ビット操作を行い、00000000 00000000 00000000 00000000、01111111、次いで8ビットのbyteタイプ01111111に切り捨てられ、結果b 2=127となり、これをintタイプのバイナリ列に変換した結果1111111111となる.
shortタイプの場合は同じです.