[计算机]位运算符

1、运算符号

含义 Java 运算规则
按位与 a & b 两个位都为1时,结果才为1
按位或 a | b 两个位都为0时,结果才为0
按位异或 a ^ b 两个位相同为0,相异为1
按位取反 ~a 0变1,1变0
左移 a << b 各二进位全部左移若干位,高位丢弃,低位补0
带符号右移 a >> b 各二进位全部右移若干位,若正数,高位补0,若负数,高位补1
无符号右移 a>>> b 各二进位全部右移若干位,不论正负,高位均补0

2、运算规则
2.1、补码
(1)正整数的补码和原码相同;
(2)负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。

要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 0000 0000 0000 0000 1010
取反:
1111 1111 1111 1111 1111 1111 1111 0101
加1:
1111 1111 1111 1111 1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 1111 1111 1111 1111 0110

2.2、按位与(&)
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。

将10与-10进行按位与(&)运算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
0000 0000 0000 0000 0000 0000 0000 1010
所以:10 & -10 = 0000 0000 0000 0000 0000 0000 0000 1010

2.3、按位或(|)
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。

将10与-10进行按位或(|)运算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
1111 1111 1111 1111 1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1111 1111 1111 1111 1110

2.4、按位异或(^)
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。

将10与-10进行按位异或(^)运算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
1111 1111 1111 1111 1111 1111 1111 1100
所以:10 ^ -10 =  1111 1111 1111 1111 1111 1111 1111 1100

可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:

a = a ^ b;
b = b ^ a;
a = a ^ b;

2.5、取反(~)
参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。

对10进行取反(~)运算:
0000 0000 0000 0000 0000 0000 0000 1010
---------------------
1111 1111 1111 1111 1111 1111 1111 0101
所以:~10 = 1111 1111 1111 1111 1111 1111 1111 0101

2.6、左移(<<)
参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。

正整数:对10左移2位(就相当于在右边加2个0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0010 1000
所以:10 << 2 = 0000 0000 0000 0000 0000 0000 0010 1000 = 40

负整数:对-10左移2位(就相当于在右边加2个0):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
1111 1111 1111 1111 1111 1111 1101 1000
所以:-10 << 2 = 1111 1111 1111 1111 1111 1111 1101 1000 = -40 

注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。

2.7、右移(>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位,若正数,高位补0,负数,高位补1。

正整数:对10右移2位(就相当于在左边加2个0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0000 0010
所以:10 >> 2 = 0000 0000 0000 0000 0000 0000 0000 0010 = 2

负整数:对-10右移2位(就相当于在左边加2个1):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
1111 1111 1111 1111 1111 1111 1111 1101
所以:-10>>2=1111 1111 1111 1111 1111 1111 1111 1101 = -3

注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意,除了以后没有小数位的,都是取整。

2.8、无符号右移(>>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位,不论正负,高位均补0。

正整数:对10右移2位(就相当于在左边加2个0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0000 0010
所以:10 >>> 2 = 0000 0000 0000 0000 0000 0000 0000 0010 = 2

负整数:对-10右移2位(就相当于在左边加2个0):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
‭0011 1111 1111 1111 1111 1111 1111 1101‬
所以:-10 >>> 2 = ‭0011 1111 1111 1111 1111 1111 1111 1101‬ = 1073741821
发布了9 篇原创文章 · 获赞 6 · 访问量 511

猜你喜欢

转载自blog.csdn.net/happygan520/article/details/104018184
今日推荐