位运算符
位运算符:对二进制的直接运算
计算机内部的数据都是以二进制形式存在的,而二进制在计算机内部又有多种编码方式
(计算机内部对二进制进行运算用的是补码)
原码:第一位是符号位 0正1负
3: 0000 0011
反码:正数的反码和原码一样,负数的反码,保留符号位,其余位按位取反
-3:原码:1000 0011 -->反码:1111 1100 -->补码:1111 1101(反码+1)
补码(用得最多的,计算机存放数据是用补码来存的):正数同原码,负数补码=反码+1;
负数原码和补码之间的转换:
负数的原码=负数补码-1 再取反 =负数补码取反+1
package com.Other;
public class Other {
public static void main(String[] args) {
int a=128;//二进制1000 0000
int b=129;//二进制1000 0001
System.out.println("a = 128,b = 129");
//按位与:同1才1
System.out.println("a & b = "+ (a & b) );//运行结果为128 1000 0000
//按位或:有1就1
System.out.println("a | b = "+ (a | b) );//运行结果为129 1000 0000
//异或:同0异1
System.out.println("a ^ b = "+ (a ^ b) );//运行结果为1 0000 0001
System.out.println("~a = "+(~a) );//-129
System.out.println("~b = " +(~b) );//-130
//左移右移正负数计算方式相同
//移位: 左移:右添0 右移:正数左添0,负数左添1
System.out.println("2 << 3 = "+( 2 << 3 )); //左移 2 *(2的3次方)=16
System.out.println("16 >> 3 = "+( 16 >> 3 )); //右移 16/(2的3次方)=2
//无符号右移 正数负数都左添0
System.out.println("-16 >>> 3 = "+( -16 >>> 3 ));
System.out.println( true & true );
System.out.println( true & false );
System.out.println( false & true );
System.out.println( false & false );
System.out.println( true | true );
System.out.println( true | false );
System.out.println( false | true );
System.out.println( false | false );
}
}
结果:
运算符的优先级