zgq105 / blog

2 stars 0 forks source link

java位运算符知识点 #83

Open zgq105 opened 4 years ago

zgq105 commented 4 years ago

在计算机系统中,计算机只能识别二进制数据,所以数据也是转成二进制才能被机器识别的。在java中,给int类型的数据分配32位(bit) 的存储空间,即4个字节的存储空间( 1 byte=8 bit),接下来都是以int类型来谈谈java中位运算符。

接下来了解下几个基本概念:

以 66 来说明下原码、反码和补码,如下: 66的原码:0000 0000 0000 0000 0000 0000 0100 0010 66的反码:0000 0000 0000 0000 0000 0000 0100 0010 66的补码:0000 0000 0000 0000 0000 0000 0100 0010

以 -66 来说明下原码、反码和补码,如下: -66的原码:1000 0000 0000 0000 0000 0000 0100 0010 -66的反码:1111 1111 1111 1111 1111 1111 1011 1101 -66的补码:1111 1111 1111 1111 1111 1111 1011 1110

说明:在计算机系统中,数值一律用补码来表示和存储。

假设int a=6,int b=66为例,下面举例会使用到,如下: 6的原码、反码、补码 :0000 0000 0000 0000 0000 0000 0000 0110 66的原码、反码、补码:0000 0000 0000 0000 0000 0000 0100 0010

1.“与”运算符(&)

当两个数对应位同时为1的时候,才为1;其余情况为0。 举例a&b结果为 2,对应的二进制为:0000 0000 0000 0000 0000 0000 0000 0010。

2.“或”运算符(|)

当两个数对应位只要有一个为1的时候,结果就为1;其余情况为0。 举例a|b结果为 70,对应的二进制为:0000 0000 0000 0000 0000 0000 0100 0110。

3.“异或”运算符(^)

当两个数对应位相同时,其结果就为0;其余情况为1。 举例a^b结果为 68,对应的二进制为:0000 0000 0000 0000 0000 0000 0100 0100。

4.“按位取反”运算符(〜)

按位取反运算符翻转操作数的每一位。 正数举例:以 66 为例,对应的二进制为0000 0000 0000 0000 0000 0000 0100 0010, 按位取反:1111 1111 1111 1111 1111 1111 1011 1101(符号位是1,变成了负数的补码) 补码减1(变反码): 1111 1111 1111 1111 1111 1111 1011 1100 再取反(变原码): 1000 0000 0000 0000 0000 0000 0100 0011 所以,结果为 -67。

负数举例:以 -66 为例,对应的二进制如下: 原码:1000 0000 0000 0000 0000 0000 0100 0010 反码:1111 1111 1111 1111 1111 1111 1011 1101 补码:1111 1111 1111 1111 1111 1111 1011 1110 按位取反:0000 0000 0000 0000 0000 0000 0100 0001(符号位是0,说明是正数的补码) 所以原码就是本身,即结果为:65

5. “按位左移”运算符(<<)

左操作数按位左移右操作数指定的位数。 举例 a<<2(表示 a 向左移动2位) 结果为 24,对应的二进制为:0000 0000 0000 0000 0000 0000 0001 1000 说明:按位左移的结果满足:m<<n=m*2ⁿ

6. “按位右移”运算符(>>)

左操作数按位右移右操作数指定的位数。 举例 a>>2(表示 a 向右移动2位) 结果为 1,对应的二进制为:0000 0000 0000 0000 0000 0000 0000 0001 说明:按位右移的结果满足:m>>n=m/2ⁿ

7. “无符号按位右移”运算符(>>>)

按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 举例 a>>>2(表示 a 向右移动2位) 结果为 1,对应的二进制为:0000 0000 0000 0000 0000 0000 0000 0001 说明:按位右移的结果满足:m>>>n=m/2ⁿ