@634

Javaの基本文法その2

Advertisement

ビット演算(論理演算)

まずは論理演算。
演算子意味
&論理積(AND)
|論理和(OR)
^排他的論理和(XOR)
~補数


使用例。
public class BitOP{
    public static void main(String args[]){
        int a = 1;
        int b = 5;

        //論理積
        int and = a&b;

        //論理和
        int or =  a|b;

        //排他的論理和
        int xor = a^b;

        //補数
        int not = ~a;
		
        System.out.println("AND :" + and);
        System.out.println("OR  :" + or);
        System.out.println("XOR :" + xor);
        System.out.println("NOT :" + not);
    }
}
実行結果
AND :1
OR  :5
XOR :4
NOT :-2
ちなみにJavaの場合、intはすべて32ビットで演算される。

ビット演算(シフト演算)

以下の演算子を使うことで、ビット列のシフトを行うことができる。
演算子意味
>>算術右シフト
>>>論理右シフト
<<算術左シフト
算術は符号を意識。論理は符号を意識しないビット移動。右シフトにのみ、論理シフトが存在する。
public class BitShift{
    public static void main(String args[]){
        int a = 2;
        int b = 32;
        int c = 0xFFFFFFFF; //-1

        //2ビット左シフト
        System.out.println("a<<2  : " + (a<<2));

        //4ビット右シフト
        System.out.println("b>>4  : " + (b>>4));

        //4ビット右シフト(論理)
        System.out.println("c>>>4 : " + (c>>>4));
   }
}
※println()の中で括弧をつけているのは演算では左側の方が優先順位が高いから。
上の例の場合では、左の値がStringなので以後の演算は文字列結合として扱われる。だから明示的に優先順位を指定する必要がある。

結果
A<<2  : 8
B>>4  : 2
C>>>4 : 268435455
Aは2*4。Bは32/16。cはFFFFFFFFが0FFFFFFFになった。
算術演算子は1桁左に移動すると数が2倍になる(オーバーフローしない場合)。 2桁で4倍、3桁で8倍。
右移動だと1桁で2分の1、2桁で4分の1。

おまけ:シフト数に32以上を指定すると、指定した数字を32で割った余りの分シフト移動される。

たとえば
int num = 10;
num >> 32
とした場合 32 ÷ 32 = 1 であまりが0だから、0ビット右シフト、つまり1桁も移動しないことになる。意味不明。

Advertisement

ショートカット

634
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール