Java-位运算符

来源:互联网 发布:嵌入式好还是java好 编辑:程序博客网 时间:2024/06/06 17:26

Java支持的位运算符有如下7个:

1.&:按位与。当量为同事为1时才返回1.
2.|:按位或。只要有一位为1极客返回1.
3.~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。
4.^:按位异或。当量为相同时返回0,不同时返回1.
5.<<:左移运算符。
6.>>:右移运算符。
7.>>>:无符号右移运算符。

一般来说,位运算符智能操作整数类型的变量或值。位运算的运算法则如下:

第一个操作数 第二个操作数 按位与 按位或 按位异或 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0

按位非只需要一个操作数,这个运算符将把操作数在计算机底层的二进制码按位(包括符号位)取反。如下代码测试了按位与和按位或运算的运算结果。

System.out.println(5 & 9);System.out.println(5 | 9);System.out.println(~-5);System.out.println(5 ^ 9);

程序执行的结果是:5&9的结果是1,5|9的结果是13,~-5的结果是4,5 ^ 9的结果是12.

运算原理

例如我们有两个十进制的操作数,首先位运算都是将操作数转换成二进制形式(0、1组成),然后再按照上述运算规则进行运算,最终取得的二进制转换成十进制就是我们想要的运算结果了。

1.按位与

按位与的运算原理就是将操作数转换为二进制形式,然后根据“当两位同时为1时才返回1”的运算规则进行运算,得到的二进制数就是运算结果。我们可以将得到的二进制数转换为其他进制的数。

例如:5 & 9 = 1的运算过程为(int类型占4个字节,1个字节=8bit,古5是由4*8=32个0或者1组合而成的)
5的二进制形式为:00000101,省略前面24个0.
9的二进制形式为:00001001,省略前面24个0.
运算过程为从最后一位开始进行按位与运算,得到的结果为00000001即
5 & 9 = 00000101 & 00001001 = 00000001 = 1

2.按位或

按位或的运算原来就是将操作数转换为二进制形式,然后根据“只要有一位为1即可返回1”的运算规则进行运算,得到的二进制数就是运算结果。我们可以将得到的二进制数转换为其他进制的数。

例如:5 | 9 = 13的运算过程同上
5 | 9 = 00000101 | 00001001 = 00001101 = 13

3. 按位非

按位非只需要一个操作数,这个运算符将把操作数在计算机底层的二进制码按位(包括符号位)取反。

例如:~-5 = 4的运算过程为:
-5的源码为:10000000 00000000 00000000 00000101
原码除符号位外取反得到反码。
-5的反码为:11111111 11111111 11111111 11111010
反码加1得到补码,负数在计算机里以补码形式存在。
-5的补码为:11111111 11111111 11111111 11111011
这就是-5了。然后按位取反,~1 = 0,~0 = 1.取反后的结果为:
00000000 00000000 00000000 00000100
最高位为0为正数,正数的补码和原码相同,上面取反结果转为十进制为4.
故 ~-5 = 4;

4.按位异或

按位以后的运算原理与按位与和按位或类似,只不过按位以后的运算规则为“当两位相同时返回0,不同时返回1”

例如5 ^ 9 = 12运算过程为:
5 ^ 9 = 0000101 ^ 00001001 = 00001100 = 12

5.左移运算符

左移运算符就是将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充。例如如下代码:

System.out.println(5 << 2); // 输出20System.out.println(-5 << 2); // 输出-20

下面以-5为例来介绍左移运算的运算过程如下:
-5是以补码形式表示的,如下:
11111111 11111111 11111111 11111011
整体向左移动两位,最左侧的两位移除之后将被阶段,而最右侧会空出两位,空出的两位则用0补位。得到的结果为:
111111 11111111 11111111 1111101100

上面的32位数是-5的不啊,左移两位后得到一个二进制补码,这个二进制补码的最高位是1,表明是一个附属,换算成二进制数就是-20.

6.右移运算符

右移运算符是讲操作数的二进制码右移指定位数后,左边空出来的位以原来符号位填充,即如果第一个操作数原来是正数,则左边补0;如果第一个操作数是负数,则左边补充1.运算规则参照左移运算符即可

7.无符号右移运算符

无符号右移运算符是讲操作数的二进制码右移指定位数后,左边空出的位总是以0填充。运算规则参照左移运算符即可。

移位运算规则

进行移位运算时还要遵循如下规则:
1.对于低于int类型(如byte、short和char)的操作数总是先自动类型转换为int类型后在移位。
2.对于int类型的正数移位a>>b,当b>>32时系统先用b对32求余(因为int类型只有32位)。得到的结果才是真正移位的位数。例如a>>33和a>>1的结果完全一样,而a>>32的结果和a相同。
3.对于long类型的正数移位a>>b,当b>64时,总是先对b对64求余(因为long类型是64位),得到的结果才是整整移位的位数。

注意

当进行移位运算时,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出得位全部都是0),不难发现左移n位就相当于乘以2的n次方,右移n位则是除以2的n次方,不仅如此,进行位移运算不会改变操作位数本身,只是得到了一个新的运算结果,而原来的操作数本身是不会改变的。

0 0
原创粉丝点击