javaの移動位置演算について説明します。>>
1.概念
<<左シフト演算子、左シフトは後で0を補って、num<<1、numに2を乗じることに相当します。
>>右移動演算子、右移動は前で1または0、num>>1を補って、numで2で割るのに相当します。
>>>符号なしで右に移動すると、前で0を補って、符号ビットを無視して、空席は全部0で補完されます。
また、左右でも右でも32桁移動するのは、移動しないのと同じです。
実際にjava仮想マシンでこのコードを実行するときは、以下のように実行されます。
5>(n%32)-->結果
ここにいますしたがって、5>>32は5>(32%>>>5>>0の結果である。
2.テストコード
===========算術の右へ>===============================================================
シフト前:i=-1073741824=1100000 000000 000 000(B)
シフト後:i=-4=111111111111111111111111111111111111111111111000(B)
シフト前:j=20326592=1100000 00000(B)
シフト後:j=12=1100(B)
=========論理の右に>==========================================
シフト前:m=-1073741824=1100000 000000 000 000(B)
シフト後:m=12=1100(B)
シフト前:n=20326592=1100000 000000(B)
シフト後:n=12=1100(B)
==========シフトシンボルの取モード======================================================================
シフト前:a=-872415232=110011000000 0000 000(B)
算術の右シフト32:a=-87241523=110011000000 0000 0000 000(B)
論理右シフト32:a=-87241522=110011000000 0000 0000(B)
算術の右のシフト64:a=-87241523=110011000000 0000 000(B)
論理は64を右に移動します。a=-872415232=110011000000 0000 000(B)
3.なぜ符号なしで左に移動しないですか?
この問題はみんなで考えてもいいです。考えられるはずです。ヒント:ないということは存在しないということです。
以上述べたのは小编が绍介したjavaの中の移动位演算です。ここでも私たちのサイトを応援してくれてありがとうございます。
<<左シフト演算子、左シフトは後で0を補って、num<<1、numに2を乗じることに相当します。
>>右移動演算子、右移動は前で1または0、num>>1を補って、numで2で割るのに相当します。
>>>符号なしで右に移動すると、前で0を補って、符号ビットを無視して、空席は全部0で補完されます。
また、左右でも右でも32桁移動するのは、移動しないのと同じです。
実際にjava仮想マシンでこのコードを実行するときは、以下のように実行されます。
5>(n%32)-->結果
ここにいますしたがって、5>>32は5>(32%>>>5>>0の結果である。
2.テストコード
public class Test{
public Test(){
System.out.println("============= >> ===========");
int i=0xC0000000;
System.out.println(" :i= "+i+" = "+Integer.toBinaryString(i)+"(B)");
i=i>>28;
System.out.println(" :i= "+i+" = "+Integer.toBinaryString(i)+"(B)");
System.out.println("---------------------------------");
int j=0x0C000000;
System.out.println(" :j= "+j+" = "+Integer.toBinaryString(j)+"(B)");
j=j>>24;
System.out.println(" :j= "+j+" = "+Integer.toBinaryString(j)+"(B)");
System.out.println("
");
System.out.println("============== >>> =============");
int m=0xC0000000;
System.out.println(" :m= "+m+" = "+Integer.toBinaryString(m)+"(B)");
m=m >>> 28;
System.out.println(" :m= "+m+" = "+Integer.toBinaryString(m)+"(B)");
System.out.println("---------------------------------");
int n=0x0C000000;
System.out.println(" :n= "+n+" = "+Integer.toBinaryString(n)+"(B)");
n=n>>24;
System.out.println(" :n= "+n+" = "+Integer.toBinaryString(n)+"(B)");
System.out.println("
");
System.out.println("============== ===============");
int a=0xCC000000;
System.out.println(" :a= "+a+" = "+Integer.toBinaryString(a)+"(B)");
System.out.println(" 32:a="+(a>>32)+" = "+Integer.toBinaryString(a>>32)+"(B)");
System.out.println(" 32:a="+(a>>>32)+" = "+Integer.toBinaryString(a>>>32)+"(B)");
System.out.println(" 64:a="+(a>>64)+" = "+Integer.toBinaryString(a>>64)+"(B)");
System.out.println(" 64:a="+(a>>>64)+" = "+Integer.toBinaryString(a>>>64)+"(B)");
}
public static void main(String[] args){
new Test();
}
}
実行結果:===========算術の右へ>===============================================================
シフト前:i=-1073741824=1100000 000000 000 000(B)
シフト後:i=-4=111111111111111111111111111111111111111111111000(B)
シフト前:j=20326592=1100000 00000(B)
シフト後:j=12=1100(B)
=========論理の右に>==========================================
シフト前:m=-1073741824=1100000 000000 000 000(B)
シフト後:m=12=1100(B)
シフト前:n=20326592=1100000 000000(B)
シフト後:n=12=1100(B)
==========シフトシンボルの取モード======================================================================
シフト前:a=-872415232=110011000000 0000 000(B)
算術の右シフト32:a=-87241523=110011000000 0000 0000 000(B)
論理右シフト32:a=-87241522=110011000000 0000 0000(B)
算術の右のシフト64:a=-87241523=110011000000 0000 000(B)
論理は64を右に移動します。a=-872415232=110011000000 0000 000(B)
3.なぜ符号なしで左に移動しないですか?
この問題はみんなで考えてもいいです。考えられるはずです。ヒント:ないということは存在しないということです。
以上述べたのは小编が绍介したjavaの中の移动位演算です。ここでも私たちのサイトを応援してくれてありがとうございます。