java 移位运算符

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/

点赞(10) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部