0
点赞
收藏
分享

微信扫一扫

Java 的位运算

  • 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 左移 << 运算

Java 的位运算

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 无符号右移 >>> 运算

举报

相关推荐

0 条评论