位运算

  3.运算符
            赋值运算符:=,+=,-=,*=,/=,%=
            变量=表达式
            将表达式结果赋给左边的变量
 
            +=
            x += 5;等同于    x = x+5;
            x *= 2+3;等同于    x = x*(2+3);
 
 
        算术运算符:+,-,*,/,++,--,%,?:
        10/2      5
        10/3      3
        10/6      1
        10/6.0    1.6666666667
 
        %:求余数
        10%5    0
        10%3    1
        3%5        3
        3.0%1    出错,小数不能参与模运算
        已经2016-3-8周三,再过15天,是周几?
        有一个两位数整数,取出个位数是几?
        xy%10
        10%10   0
        15%10    5
        98%10    8
        x是不是y的倍数
        x%y==0
        前置 后置
        ++x   x++        x = x+1
        --x   x--
 
        复合运算
            y = x++;    前提x=5, 计算后y=5, x=6
            y = ++x;    前提x=5, 计算后y=6, x=6
 
            System.out.print(x++);
            System.out.print(x);前提x=5,输出5,6
 
            System.out.print(++x);
            System.out.print(x);前提x=5,输出6,6
 
            System.out.print(x+1);前提x=5,输出6
            System.out.print(x++);前提x=5,输出5
 
        ?:条件运算符,三目运算符,多元运算符
        条件?真值:假值
 
        z = x>y?x:y;前提x=5,y=6,z的结果6
        x>Y?假
        取y
        赋值
 
        程序中保存性别0,1分别表示男,女
        String s = sex==1?"男":"女";
        System.out.print(s);       
 
        关系运算符:==,>=,<=,!=,>,<
        关系运算符的结果是布尔值。
 
        ==,!=是用于比较两个值是否相等或不等,
        这两个操作可以任意类型,但不保证结果正确。
        如果基本数据类型,结果正确。
        如果是引用类型,比较两个对象的地址是不是同一个。
 
        >,>=,<,<=只能比较基本数据类型的数据,不能用于比较引用型数据类型的数据。
 
 
        逻辑运算符:&&,||,!,&,|
        &&和||,对应and和or,连接多个关系运算,结果还是布尔值。
        a>b && b>c: 
            a>b和b>c同时为true,结果为true,否则为false   
        a>b || b>c: 
            a>b和b>c同时为false,结果为false,否则为true。
 
        !表示取反.
        !(a>b):
            如果a>b为true, 结果为false;
            如果a>b为false, 结果为true。
 
        是不是闰年(year)?
            year%4==0&&year%100!=0 || year%400==0
        是不是平年(year)?
            !(year%4==0&&year%100!=0 || year%400==0)
            或
            (year%4!=0 || year%100==0) && year%400!=0
 
 
        &&与&区别:
            &&运算效率高,短路and,如果左边为false,右边不再计算。
            &运算左右两边无论任何情况下都要计算。
 
            前提:x=5,y=6
            x++>5 && y++>6;
            计算条件结果是false,x=6,y=6
 
 
            前提:x=5,y=6
            x++>5 & y++>6;
            计算条件结果是false,x=6,y=7
 
 
        位运算符:&,|,~,^,>>,<<,>>>
            只对数值计算
            &:按位与
            例如:5&10
                5的二进制原码    0000 0101
                10的二进制原码    0000 1010
                然后每个对应进行与运算,其结果是0
 
                与:只要同为1,结果为1,否则为0
 
            |:按位或
                或:只要同为0,结果为0,否则为1
 
            ^:按位异或
                异或:相同为0,不同1
 
            例如:    8^12结果4               
 
                0000 1000
            ^    0000 1100
            ------------------
                0000 0100
 
 
            ~:按位取反
            取反:0变1,1变0
 
            例如:~5结果是250
                0000 0101
            -----------------
                1111 1010
 
 
        其它运算符:待续
    赋值运算符:
        =    +=    -=    *=    /=    %=
    算术运算符
       +    -    *    /   ++    --    -    %  ?:
10/2   5
10/3   3
10/3.3 3.33333
 
10%5     0
10%3     1
3%5     3
3.0%1   出错,小数不能参与模运算
    关系运算符(比较运算符)
        ==    !=    >    >=      <    <=    ===
    逻辑运算符
        &&     ||        !       &        |
    位运算符:
          &   | ~  ^ << >>
    其它运算符
        ()    .    []    new   instanseof
结合性
     一般情况是从左先右
     从右向左
          -      !      ~      ++      --      -      ?:
优先级
     一级     (),[]
     二级     !,++,--,-(负号)
     三级     *,/,%
     四级     +,-
     五级     按逻辑运算<<,>>
     六级     <,<=,>,>=
     七级    ==,!=
      8 9 10 级    按位逻辑运算&,^,|
      11级    &&
      12级     ||
      13级     ?:
      14级     =
 
 
 
public class Weiyunsuan{
  public static void main (String[] args){
    // 1、左移( << )
        // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
        // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
        System.out.println(5 << 2);// 运行结果是20
 
        // 2、右移( >> ) 高位补符号位
        // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
        // 0000 0000 0000 0000 0000 0000 0000 0001
        System.out.println(5 >> 2);// 运行结果是1
 
        // 3、无符号右移( >>> ) 高位补0
        // 例如 -5换算成二进制后为:0101 取反加1为1011
        // 1111 1111 1111 1111 1111 1111 1111 1011
        // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
        System.out.println(5 >> 3);// 结果是0
        System.out.println(-5 >> 3);// 结果是-1
        System.out.println(-5 >>> 3);// 结果是536870911
 
        // 4、位与( & )
        // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
        System.out.println(5 & 3);// 结果为1    0101  0011    0001=1    同1得一,否则为0
        System.out.println(4 & 1);// 结果为0    0100  0001  0000=0
 
        // 5、位或( | )
        // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
        System.out.println(5 | 3);// 结果为7    0101  0011    0111=7  有一个1结果是一,否则为0
 
        // 6、位异或( ^ )
        // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
         System.out.println(5 ^ 3);//结果为6
 
        // 7、位非( ~ )
        // 操作数的第n位为1,那么结果的第n位为0,反之。
        System.out.println(~5);// 结果为-6
 
Scanner input = new Scanner (System.in);
        System.out.print("请输入一个整数,判断基偶数:");
        int num = input.nextInt();
        if((num&1)==1)
        System.out.println("这是一个基数");
        else
        System.out.println("这是一个偶数");
  }
}

 

 

posted @ 2018-01-04 10:02  zachary7  阅读(216)  评论(0编辑  收藏  举报