- 3.5 无符号右移 >>> 运算
[](()1 位运算定义
==========================================================================
位运算之于二进制可以看做是加减乘除运算之于十进制。 因为我们已经熟悉了十进制运算,所以会感觉二进制的位运算可以会比较绕。
移位运算符的拓展知识:根据定义,Java 的 int
型变量是 4 位的,即占有 4×8=32 byte
,由于需要在 byte
的最前面加上符号位,所以 int
型变量的取值范围是 2 的 32 次方(即 -2 的 31 次方 ~ +2 的 31 次方 )
。
[](()2 码制
=======================================================================
[](()2.1 码制定义
二进制数的第一位规定是符号位,其中 0 表示正,1 表示负。二进制数有三种表示法,分别是原码,反码,补码。
其中正数的 原码 = 反码 = 补码。如:
示例: 十进制 5 的二进制原码是 0 0000101;反码是 0 0000101;补码是 0 0000101。
负数的 :
-
原码为符号位“1”+该负数对应的绝对值的原码;
-
反码为符号位“1”+该负数对应的绝对值的原码的按位取反;
- 补码为符号位“1”+该负数对应的绝对值的原码的按位取反后,并在末位(即最右端)进行“+1”运算。
示例:十进制 -5 的二进制原码是 1 0000101; 反码是 1 1111010; 补码是 1 1111011。
[](()2.2 码制运算
[[X]反]反=[X]原
[[X]补]补=[X]原
[X]反+[Y]反=[X+Y]反(循环进位)
[X]补+[Y]补=[X+Y]补(舍弃进位)
[](()3 二进制的运算
===========================================================================
[](()3.1 位运算符
| 位运算符 | 执行原理 |
| --- | --- |
| 与 & | 两个操作数同时为1,结果为1 |
| 或 l | 两个操作数只要有一个为1,结果就为1 |
| 异或 ^ | 两个操作数相同,结果为0,不相同,结果为1 |
| 非 ~ | 操作数为1,结果为0;操作数为0,结果为1 |
| \>> | 右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,若为正数则高位补0,若为负数则高位补1 |
| << | 左移运算符,符号左侧数值 按位左移 符号右侧数值指定的位数,并在低位处补0 |
| \>>> | 无符号右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,无论正负高位补0,因为符号位也置为0,所以此时的补码便是原码 |
[](()3.2 与& 运算
[](()3.2.1 运算规则
-
正数之间:通过使用它们的原码进行运算;
- 非正数之间:利用它们的补码进行运算。如果运算结果的符号位是 0,则直接得到结果;如果运算结果的符号位是 1, 则该运算结果的补码才是最终答案。
[](()3.2.2 实例
===========================================================================
1)正数之间的运算,范例为 4 & 5:
0 0 0 0 0 1 0 0 = 4
0 0 0 0 0 1 0 1 = 5
———————————————
0 0 0 0 0 1 0 0 = 4 & 5 = 4
2)正数与负数之间(当结果的符号位为 0),范例为 -4 & 5::
1 0 0 0 0 1 0 0 = -4 的原码
0 0 0 0 0 1 0 1 = 5 的原码
———————————————
1 1 1 1 1 1 0 0 = -4 的补码
0 0 0 0 0 1 0 1 = 5 的原码
———————————————
0 0 0 0 0 1 0 0 = -4 & 5 = 4
3)负数之间(当结果的符号位为 1),范例为 -4 & -5::
1 0 0 0 0 1 0 0 = -4 的原码
1 0 0 0 0 1 0 1 = -5 的原码
———————————————
1 1 1 1 1 1 0 0 = -4 的补码
1 1 1 1 1 0 1 1 = -5 的补码
———————————————
1 1 1 1 1 0 0 0 符号位为 1,故继续进行补码操作
———————————————
1 0 0 0 1 0 0 0 = -8
或 l 运算
、异或 ^ 运算
、非 ~ 运算
与与& 运算
的运算规则相同。
[](()3.3 左移 << 运算
1)正数
规则:二进制数向左移动两位,并在最右边用 0 补位。
0 0 0 0 0 1 0 0 = 4
———————————————
0 0 0 1 0 0 0 0 = 4<<2 = 16
2)负数
规则:二进制数的补码向左移动两位,并在最右边用 0 补位,同时重新转换成补码。
1 0 0 0 0 1 0 0 = -4 的原码
1 1 1 1 1 1 0 0 = -4 的补码
———————————————
1 1 1 1 0 0 0 0 = -4 的补码<<2
——————————————— 再次求补码
1 0 0 1 0 0 0 0 = -16
[](()3.4 右移 >> 运算
1)正数
规则:二进制数向右移动两位,并在最左边用 0 补位。
0 0 0 0 0 1 0 0 = 4
———————————————
0 0 0 0 0 0 0 1 = 4>>2 = 1
2)负数
规则:二进制数的补码向右移动两位,并在最左边用 1 补位,同时重新转换成补码。
1 0 0 0 0 1 0 0 = -4 的原码
1 1 1 1 1 1 0 0 = -4 的补码
———————————————
1 1 1 1 1 1 1 1 = -4 的补码>>2,同时在最左边用 1 补位
———————————————
1 0 0 0 0 0 0 0 保留符号位,然后按位取反
1 0 0 0 0 0 0 1 = -1 然后加1,即为所求数的原码
[](()3.5 无符号右移 >>> 运算