java按位运算符(&、|、~、^) 移位操作符(>> >> )

位运算符来源于C语言面向底层的操作,在这种操作中经常需要直接操作硬件,设置硬件寄存器内的二进制位。Java的设计初衷是为了嵌入电视机机顶盒,所以种面向底层的操作仍被保留了下来。

1、“与”、“位与”(&)

        按位“与”操作符,如果两个数的二进制,相同位数都是1,则该位结果是1,否则是0.

  例1 5&4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0100  转为十进制是4。

2、“或”、“位或”(|)

        按位“或”操作符,如果两个数的二进制,相同位数有一个是1,则该位结果是1,否则是0

  例2  5 | 4

        5的二进制是  0000 0000 0000 0101

      4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0101  转为十进制是5。

3、“异或、“位异或”(^)

        按位“异或”操作符,如果两个数的二进制,相同位数只有一个是1,则该位结果是1,否则是0

  例3  5 ^ 4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0001 转为十进制是1 

4、“非”、“位非”(~)也称为取反操作符

        按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0。

  例4  ~5

        5的二进制是  0000 0000 0000 0101

        则~5是           1111 1111 1111 1010  转为十进制是 -6。

        这里出现负数,强行插入一波^_^。

        电脑的的世界中只有0和1,那么负数怎么表示呢?

        二进制的正负是从高位看,最高位如果1则是负数,如果是0则是正数。

        如果负数单纯是把最高位变为1的话,在运算中会出现不是我们想要的值,所以引入了:原码,反码,补码。正数的原码,反码,补码都一样,负数的反码是对除了符号位(最高位)对原码取反,补码是对反码+1

        负数的二进制转化,计算机计算是用的补码

1、首先取出这个数的原码的二进制,

2、然后再求出反码

3、最后求出补码


  例5  -5

        -5的原码是                1000 0000 0000 0101

        求出反码的是            1111 1111 1111 1010

        求出补码是                1111 1111 1111 1011

Java移位操作符

        移位操作符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型,左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0),“有符号”右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移。“有符号”右移位操作符使用“符号扩展”;若符号位正,则在高位插入0;若符号位负。则在高位插入1。java中增加了一种“无符号”右移位操作符(>>>),他使用“零扩展”;无论正负,都在高位插入0。这一操作符是C或C++中所没有的。

  例6  5<<2 等于20
        5的二进制是   0000 0000 0000 0101
        左移两位         0000 0000 0001 0100
  例7  5>>2 等于 1
        5的二进制是   0000 0000 0000 0101
        右移两位         0000 0000 0000 0001
  例8  -5>>2 等于 -2
        -5的二进制是   1111 1111 1111 1011
        右移两位          1111 1111 1111 1110 转十进制,例5反着来,先-1,然后取反

Java运算符优先顺序

优先级 运算符分类 结合顺序 运算符

分隔符 左结合 .    []     ( )     ;      ,
一元运算符 右结合 !  ++     --     -   ~

算术运算符

移位运算符

左结合 *     /      %    +     -      <<   >>   >>>
关系运算符 左结合 <     >     <=   >=   instanceof(Java 特有)   = =  !=
逻辑运算符 左结合 ! &&  ||  ~  &  |  ^ 
三目运算符 右结合 布尔表达式?表达式1:表达式2
赋值运算符 右结合 =  *=     /=  %=   +=   -=    <<= >>= >>>=  &=  *=  |=

移位运算符

   移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。

运算符 含义 例子
<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3
>> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3
>>> "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3


原文:https://blog.csdn.net/mxiaoyem/article/details/78569782 

猜你喜欢

转载自blog.csdn.net/qq_35588077/article/details/84974580