Java中的移位运算符分为三种:左移运算符(<<)、右移运算符(>>)和无符号右移运算符(>>>)。
1. 左移运算符(<<)
左移运算符(<<)会将一个数向左移动指定的位数。例如:
```java
int a = 3; // a 的二进制表示为 0000 0011
int b = a << 2; // b 的二进制表示为 0000 1100,十进制为 12
```
左移运算符将原数的二进制值向左移动指定位数,低位补0。因此,a在向左移动2位后,得到的结果为12,即二进制的0000 1100。
使用左移运算符的场景:
* 将一个数乘以2的n次方,可以用左移运算符实现。
```java
int a = 3;
int b = a << 2; // b的值为12,相当于3乘以2的2次方
```
* 快速计算2的n次幂,可以用左移运算符实现。
```java
int b = 1 << 2; // b的值为4,相当于2的2次方
int c = 1 << 4; // c的值为16,相当于2的4次方
```
2. 右移运算符(>>)
右移运算符(>>)会将一个数向右移动指定的位数。移动后,高位用符号位进行填充。例如:
```java
int a = -16; // a 的二进制表示为 1111 0000
int b = a >> 2; // b 的二进制表示为 1111 1100,十进制为 -4
```
右移运算符将原数的二进制值向右移动指定位数,高位使用符号位进行填充。因此,a在向右移动2位后,得到的结果为-4,即二进制的1111 1100。
使用右移运算符的场景:
* 将一个数除以2的n次方,可以用右移运算符实现。
```java
int a = 16;
int b = a >> 2; // b的值为4,相当于16除以2的2次方
```
* 取一个数的二进制位的值,可以用右移运算符实现。例如,用右移运算符取出一个int类型数的最低位:
```java
int a = 17;
int lowestBit = a & 1; // 将a与1进行按位与运算,取出最低位
int b = a >> 1; // 右移1位,相当于将a的二进制位向右移动1位
int nextLowestBit = b & 1; // 取出a的次低位
```
3. 无符号右移运算符(>>>)
无符号右移运算符(>>>)会将一个数向右移动指定的位数,移动后,高位用0填充。例如:
```java
int a = -16; // a 的二进制表示为 1111 0000
int b = a >>> 2; // b 的二进制表示为 0011 1100,十进制为 1073741820
```
无符号右移运算符将原数的二进制值向右移动指定位数,高位使用0进行填充。因此,a在向右移动2位后,得到的结果为1073741820,即二进制的0011 1100 0000 0000 0000 0000 0000 0100。
使用无符号右移运算符的场景:
* 将负数转换为正数,可以用无符号右移运算符实现。
```java
int a = -16;
int b = a >>> 1; // b的值为2147483638,就是2的31次方-8
```
在将负数向右移动时,符号位一直为1,因此要将符号位也向右移动,并填充0,才能得到正确的结果。
* 取一个数的二进制位的值,可以用无符号右移运算符实现。例如,用无符号右移运算符取出一个int类型数的最高位:
```java
int a = 17;
int b = a >>> 31; // b的值为0
int c = (a >>> 30) & 1; // c的值为0
int d = (a >>> 29) & 1; // d的值为0
int e = (a >>> 28) & 1; // e的值为0
int f = (a >>> 27) & 1; // f的值为0
int g = (a >>> 26) & 1; // g的值为0
int h = (a >>> 25) & 1; // h的值为0
int i = (a >>> 24) & 1; // i的值为0
int j = (a >>> 23) & 1; // j的值为0
int k = (a >>> 22) & 1; // k的值为0
int l = (a >>> 21) & 1; // l的值为0
int m = (a >>> 20) & 1; // m的值为0
int n = (a >>> 19) & 1; // n的值为0
int o = (a >>> 18) & 1; // o的值为0
int p = (a >>> 17) & 1; // p的值为0
int q = (a >>> 16) & 1; // q的值为0
int r = (a >>> 15) & 1; // r的值为0
int s = (a >>> 14) & 1; // s的值为0
int t = (a >>> 13) & 1; // t的值为0
int u = (a >>> 12) & 1; // u的值为0
int v = (a >>> 11) & 1; // v的值为0
int w = (a >>> 10) & 1; // w的值为0
int x = (a >>> 9) & 1; // x的值为0
int y = (a >>> 8) & 1; // y的值为0
int z = (a >>> 7) & 1; // z的值为0
int aa = (a >>> 6) & 1; // aa的值为0
int bb = (a >>> 5) & 1; // bb的值为1
int cc = (a >>> 4) & 1; // cc的值为0
int dd = (a >>> 3) & 1; // dd的值为0
int ee = (a >>> 2) & 1; // ee的值为0
int ff = (a >>> 1) & 1; // ff的值为1
int gg = a & 1; // gg的值为1
```
取一个数的二进制位的值,可以通过循环使用无符号右移运算符来实现。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复