zoukankan      html  css  js  c++  java
  • Java运算符

    1.运算符

    1.1算术运算符

    +(加)  -(减)  *(乘)  /(除)  %(取余)

    如:

    int a = 5+4//a=9

    int b = a*2//b=18

    int c = b/4//c=4

    int d = b-c//d=14

    int e = -d//e=-14

    int f = e%4//f=-2

    1.2赋值运算符

    =   +=   -=  *=  /=  %=  <<=  >>=   &=  |=  ^=

    1.3短路运算符

    与(&&)、或(||

    && :它表示的是:当左边的表达是是false的话,右边的表达式将不进行运算

    ||   :表示:当左边的表达是为true的话,右边的表达式将不进行运算

    1.4关系运算符

    等于符号:==     不等于符号:!=           大于符号:>

    小于符号:<       大于等于符号:>=        小于等于符号:<= 

    例如:

    9.5<8;        //false

    8.5<=8.5;     //true

    'A' < 'a');     //false

    1.5条件运算符(三目运算符)

    ?:  

    例如:a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;这整个运算符包括一个关系运算符(可以是“>”"<""!="等等),一个,一个,冒号前后需要有两个表达式或者是值或者是对象。

    1.6自加减运算符

    ++(自增)  - -(自减)

    例如:

    int i = 0;       //i=0
    int j = i++;     //j=0
    int k = --i;     //k=0

    1.7正负号运算符

    +(取正)  -(取负)

    1.8位移运算符

    << 带符号左移       >>带符号右移           >>> 无符号右移

    左移运算符:

    1)它的通用格式如下所示:
    value << num
    num 指定要移位值value 移动的位数。
    左移的规则只记住一点:丢弃最高位,0补最低位
    如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。

    2)运算规则
    按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
    当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
    当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
    当左移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

    3)数学意义
    在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以21次方,左移n位就相当于乘以2n次方

    4)计算过程:
    例如:3 <<2(3int)
    1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011
    2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
    3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100
    转换为十进制是12

    移动的位数超过了该类型的最大位数,
    如果移进高阶位(3163位),那么该值将变为负值。下面的程序说明了这一点:

    // Left shifting as a quick way to multiply by 2.
    public class MultByTwo {
    public static void main(String args[]) {
       int i;
       int num = 0xFFFFFFE;
       for(i=0; i<4; i ) {
           num = num << 1;
         System.out.println(num);
       }
      }
    }

    该程序的输出如下所示:

    536870908
    1073741816
    2147483632
    -32
    注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)

    右移运算符

    右移运算符<<使指定值的所有位都右移规定的次数。

    1)它的通用格式如下所示:

    value >> num

    num 指定要移位值value 移动的位数。

    右移的规则只记住一点:符号位不变,左边补上符号位

    2)运算规则:

    按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

    当右移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

    例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移

    操作时用来保持负数的符号。

    3)数学意义

    右移一位相当于除2,右移n位相当于除以2n次方。

    4)计算过程

    11 >>2(11int)

    1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011

    2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。

    3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010

    转换为十进制是3

    35 >> 2(35int)

    35转换为二进制:0000 0000 0000 0000 0000 0000 0010 0011

    把低位的最后两个数字移出:0000 0000 0000 0000 0000 0000 0000 1000

    转换为十进制: 8

    5)在右移时不保留符号的出来

    右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。

    例如

    public class HexByte {

    public static public void main(String args[]) {

    char hex[] = {

    '0', '1', '2', '3', '4', '5', '6', '7',

    '8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

    };

    byte b = (byte) 0xf1;

    System.out.println("b = 0x" hex[(b >> 4) & 0x0f] hex[b & 0x0f]);}}

    (b >> 4) & 0x0f的运算过程:

    b的二进制形式为:1111 0001

    4位数字被移出:0000 1111

    按位与运算:0000 1111

    转为10进制形式为:15

    b & 0x0f的运算过程:

    b的二进制形式为:1111 0001

    0x0f的二进制形式为:0000 1111

    按位与运算:0000 0001

    转为10进制形式为:1

    所以,该程序的输出如下:

    b = 0xf1

    无符号右移

    无符号右移运算符>>>

    它的通用格式如下所示:

    value >>> num

    num 指定要移位值value 移动的位数。

    无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

    无符号右移运算符>>> 只是对32位和64位的值有意义

    1.9逻辑运算符

    &&(短路与)  ||(短路或)  !(非) &(与)  |(或)

    !:这个没说的就是非运算符

    & :无论左边的表达式结果是:true还是false,右边的表达式都会进行运算

    |  :表示无论左边的表达式结果是:true还是false,右边的表达式都将进行运算

    && :它表示的是:当左边的表达是是false的话,右边的表达式将不进行运算

    ||   :表示:当左边的表达是为true的话,右边的表达式将不进行运算

    1.10位运算符

      与(&)、非(~)、或(|)、异或(^

    &:双目运算符,运算时均把运算数转换为二进制再做比较,规则:当相同的位上均为1时结果为1,否则结 果为0.如:1010&1101,转为二进制:1111110010&10001001101,比较结果为:1000000转为十进制: 64。所以1010&1101=64

    | :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110

    ~01,10

    ^:两边的位不同时,结果为1,否则为0.1100^1010=0110

    1.11new

    new 关键字用来在堆中申请空间

    如:str = new String("Hello!");

    1.12instanceof

    运算符双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false

    1.13()

    ()用于强制类型转换和改变执行优先权;如:

    int i=1;

    long l=(long)i;

    注意:Java语言和解释器限制使用强制和转换,以防止出错导致系统崩溃。整数和浮点数运算符间可以来回强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。

    Java中整数运算符在整数运算时,如果操作数long类型,则运算结果是long类型,否则为int类型,绝不会是byteshortchar型。这样,如果变量i被声明为shortbytei+1的结果会是int。如果结果超过该类型的取值范围,则按该类型的最大值取模。

    1.14[ ]

    []用于通过其内部下标取出数组内对应值

    1.15.

    .Java中,用来区别包名和类名,以及区别类名与它们的公共方法和属性名字。

    现在看下面的语句:

    int[ ] array = { 4, 99, 32, 11, 0, 75, 6 };

    java.util.Arrays.sort(array);

    这里有个被Arrays工具类的sort方法调用的整数数组。点符号把包名(java.util)和类名(Arrays)区分开来,也把Arrays类名和sort方法名分离开了。

    2优先级与结合性

    优先级

    运算符

    结合性

    1

    ()[].

    从左向右

    2

    !+(正)-(负)~ ++ --

    从右向左

    3

    * / %

    从左向右

    4

    +(加)-(减)

    从左向右

    5

    <<      >>      >>>   

    从左向右

    6

    <     <=     >     >=     instanceof

    从左向右

    7

    ==    !=

    从左向右

    8

    &(按位与)

    从左向右

    9

    ^

    从左向右

    10

    |

    从左向右

    11

    &&

    从左向右

    12

    ||

    从左向右

    13

    ?:

    从右向左

    14

    =   +=  -=   *=   /=   %=   &=  |=   ^=   ~=  <<=  >>=  >>>=

    从右向左

  • 相关阅读:
    轻量级数据持久层Seaking.PL简介--Query对象
    轻量级数据持久层Seaking.PL简介及建议征集
    Google秘密搜索入口
    异常,究竟抛向何处?
    [转]深入讲解ASP+ 验证
    .Net卸载程序的制作
    性能测试:Reflection VS CodeDom
    小心文件夹名称中的特殊字符
    [转]用Web标准进行开发
    使用ASP.Net Forms模式实现WebService身份验证
  • 原文地址:https://www.cnblogs.com/Li-Wei/p/6274225.html
Copyright © 2011-2022 走看看