Java零基础29-位运算符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shilishili/article/details/88424838

阅读完后:

  • 什么是位运算符【掌握】
  • 位运算符的计算分析【了解】

前言

我们开始学习 Java 位运算符,Java 程序语言支持在整数类型上执行位操作和移位操作,并提供相应的运算符。位运算是对二进位(bit)为单位进行运算的,操作数和结果都是整型数据。

位运算符和移位运算符在项目中不是很常用。处理整型类型时,可以直接对组成整型数值的各个位完成操作。
位运算符包括:~(取反)、&(位与)、|(位或)、^(位异或)、<<(左移)、>>(有符号右移)、>>>(无符号右移)。

进行移位运算时操作数总是先自动类型转换为 int 类型后再移位。

位运算符计算表格如下:

运算符 名称 示例 说明
~ 取反 ~x 将 x 的值按位取反
& 位与 x&y x 与 y 位进行位与运算
| 位或 x|y x 与 y 位进行位或运算
^ 位异或 x^y x 与 y 位进行异或运算
<< 左移 x<<a x 左移 a 位,低位用 0 补位
>> 有符号右移 x>>a x 右移 a 位,高位采取符号位补位
>>> 无符号右移 x>>>a x 右移 a 位,高位用 0 补位

复合位运算符计算表格如下:

运算符 名称 示例 说明
&= 位与等于 x&=y 等价于 x=x&y
|= 位或等于 x|=y 等价于 x=x|y
^= 位异或等于 x^=y 等价于 x=x^y
<<= 左移等于 x<<=a 等价于 x=x<<a
>>= 有符号右移 x>>=a 等价于 x=x>>a
>>>= 无符号右移 x>>>=a 等价于 x=x>>>a

符合位运算符不常用,了解即可

取反(~)

取反将操作数位 1 修改为 0,0 修改为 1。

示例代码如下:

int myInt = ~50;
System.out.println(myInt);	// 输出:-51
对 50 进行按位取反后,最后结果为 -51
对 50 进行按位取反后,最后结果为 -51

按位与(&)

按位与将两个操作数对应位都是 1,结果为 1,否则为 0。

示例代码如下:

int number1 = 42;
int number2 = 15;
int result = 42&15;
System.out.println(result);	// 输出:10
42 和 15 进行按位与操作后,最后结果为 10
42 和 15 进行按位与操作后,最后结果为 10

按位或(|)

按位或将两个操作数对应位都是 0,结果为 0,否则为 1。

示例代码如下:

int number1 = 42;
int number2 = 15;
int result = 42|15;
System.out.println(result);	// 输出:47
42 和 15 进行按位或操作后,最后结果为 47
42 和 15 进行按位或操作后,最后结果为 47

按位异或(^)

按位异或将两个操作数对应位相同(同时为 0 或同时为 1),结果为 0,否则为 1。

示例代码如下:

int number1 = 42;
int number2 = 15;
int result = 42^15;
System.out.println(result);	// 输出:37
42 和 15 进行按位异或操作后,最后结果为 37
42 和 15 进行按位异或操作后,最后结果为 37

左移(<<)

左移将操作数所有二进制位向左移位,右边的空位补 0,左边移走的部分舍去。

示例代码如下:

int myInt = 42<<2;
System.out.println(myInt);	// 输出:168
将 48 的二进制数向左移 2 位,最后结果为 168
将 48 的二进制数向左移 2 位,最后结果为 168

右移(>>)

右移也成为带符号右移,右移将操作数所有二进制位向右移位,如果最高位是 0 ,左移空位补 0;如果最高位是 1,右移空位补 1。也可以这么说,数值是负数就补 1,是正数就补 0。

示例代码如下:

int myInt = 42>>2;
System.out.println(myInt);	// 输出:10
将 48 的二进制数向右移 2 位,最后结果为 10
将 48 的二进制数向右移 2 位,最后结果为 10

无符号右移(>>>)

无符号右移将操作数所有二进制位向右移位,左边的空位补 0。

示例代码如下:

int myInt = 42>>>2;
System.out.println(myInt);	// 输出:10
将 48 的二进制数向无符号右移 2 位,最后结果为 10
将 48 的二进制数向无符号右移 2 位,最后结果为 10

右移与无符号右移区别

右移和无符号右移在移位操作上非常相似,它们只有一个区别,那就是否保留当前数值的符号再进行移位。

右移是带符号的,右移补位是根据高位的 0 和 1 决定,移位的时候符号不丢失。
无符号右移是不带符号的,无符号右移只补位0,移位的时候符号都变为正数(0)。

在本章我们学习了:

  • 位运算符是在正数类型上执行位操作和移位操作
  • 取反将操作数位 1 修改为 0,0 修改为 1
  • 按位与将两个操作数对应位都是 1,结果为 1,否则为 0
  • 按位或将两个操作数对应位都是 0,结果为 0,否则为 1
  • 按位异或将两个操作数对应位相同(同时为 0 或同时为 1),结果为 0,否则为 1
  • 左移将操作数所有二进制位向左移位,右边的空位补 0,左边移走的部分舍去
  • 右移将操作数所有二进制位向右移位,如果最高位是 0,则左移空位补 0,否则补 1
  • 无符号右移将操作数所有二进制位向右移位,左边的空位补 0
  • 无符号与有符号右移区别在于是否保留符号进行移位

接下来,我们开始学习 Java 运算符优先级:Java零基础30-运算符优先级

猜你喜欢

转载自blog.csdn.net/shilishili/article/details/88424838
今日推荐