バイナリビット演算

2087 ワード

Javaのバイナリビット演算は次のように分けられます.
  • ビット逆
  • 押位と
  • ビットまたは
  • 按位異または
  • 左に
  • 移動
  • 右シフト


  • 一:ビット毎に逆~というのは、その名の通り、バイナリビットのビット毎に逆例:000101100~000101100=11010011をとるが、オンマシン運転時にSystem.out.println(~5)出力ビット-6
    解析では,Javaは補数を用いてバイナリを表し,補数表現では最高0が正数を表し,最高位が1が負数を表す.1.正数では最上位は0、残りは+42=0101010のように数値そのものを表す.負数については,その数の絶対値の補符号を逆にして1つ加算すると,その負数の補符号が得られる.例えば-1-1の絶対値の符号化が0000 0001の符号化を逆にすると:11111110に1:11111111を加えるので-1の符号化は111111112である
    5のバイナリコードは0000 0101で、逆を取って11111010で、逆を取った値は私たちがパソコンに保存した値ですが、もし私たちがそれを出力するならば、10進数の形式で表示しなければなりません.11111010はパソコンの中で補コードで、補コードは直接10進数まで見えにくいので、私たちは上の方法で原コードを出して、この補コードの最高位は1です.したがって負数であり、負数の補符号=~|負数|+1|負数|=~(補符号-1)11111010-1=1111001が逆になった後:00000110このバイナリに対応する10進法は6であるので出力は-6であり、
    二:ビットと&1.2つのオペランドのうち、2つの対応するビットが1の場合、そのビットの結果は1である、そうでない場合、0は、例える、01011010&00101111=0001010である.ビットとの運用:(1)特定のビットをクリア0、(特定のビットであってもよいし、何ビットであってもよい)i&8は右側の4ビットが変わらず、他のビット数はクリア0(2)ある数の指定ビットi&16が変数の5位を取り出す
    三:ビットまたは|1.定義:2つのオペランドのうち、2つの対応するビットの値がいずれも0の場合にのみ、そのビットの結果ビット0、残りはいずれも1、例えば、11110010|0010111=1111011011である.運用:特定位置を1、i|16:第5位置を1
    四:ビット別異或^(異或演算は反転可能であり、演算は可逆的である)1.定義:2つのオペランドのうち、2つの対応するビットが同じ場合は0、そうでない場合は1、たとえば01010110^00101110=1111000.運用:(1)1の特殊性を考慮すると,1^1=0,1^0=1つまり1と任意の数が異なると逆の数になるので,特定のビットを反転させることができ,(2)補助変数を用いずに2つの数の交換int a=15 int b=24 BIN(a)=0001111 BIN(b)=0001011000 a=b^a–00010111 b=a^b–00001111-15 a=a^b–00011000-24を実現できる.
    五:右移動>>1.定義:1つのバイナリ数を右に移動する高位を0で揃える、低位に移動するのは不要である例えば:b=1010011、b>>1=1101001.運動:1つの整数型に対して、バイナリに変換して、右に1位移動して、2を除いて商を取ることに相当して、右に移動する方法で除算より出発を実現します.
    六:左移動<<1.定義:1つのバイナリ数を左に移動する低位を0で補正高位移動は不要である例えば、a=0001111、a<<2=00011100.運用:(1)オーバーフローしない場合、左シフト1ビットは、この数(整数型)を2乗することに相当し、同様に左シフトの方法で乗算を実現するのは乗算演算よりも速い(2)左シフト実2のべき乗演算、例えば2^4=1<<3、2^4=16、1<<3=1000を10進式に変換することができる:2^n=1<(3)左シフトは2進法から10進法に変換することができる
    //array:           
                int sum=0;
    			for(int j=0;j

    (3)nビットバイナリがすべて1であることを求めることができる場合、対応する10進数の値は、例えば、1 2進数が6ビット111111=1<<6-1=63