【MySQL】位运算符与运算符的优先级

124 阅读5分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

目录

022ED084.jpg 今天阿文介绍的内容:

  • 什么是位运算
  • 运算符的优先级

1.位运算符

位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。MySQL中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)和按位取反(~),如下表:

Snipaste_2022-09-05_09-20-13.png

1.1位或运算符(|)

位或运算的实质是将参与运算的几个数据按照对应的二进制数逐位进行逻辑或运算。对应的二进制位有一个或两个为1则该位的运算结果为1,否则为0。

例如:10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15;9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位或运算之后,结果为1111,即整数15。其结果为一个64位无符号整数。

例子:

SELECT 10 | 15, 9 | 4 | 2;

返回结果为:

image.png

1.2位与运算符(&)

位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算。对应的二进制位都为1则该位的运算结果为1,否则为0。

例如:10的二进制数值为1010,15的二进制数值为1111,按位与运算之后,结果为1010,即整数10;9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位与运算之后,结果为0000,即整数0。其结果为一个64位无符号整数。

例子:

SELECT 10 & 15, 9 & 4 & 2;

返回结果为:

image.png

1.3位异或运算符(^)

位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果才为1。如果两个对应位数都为0或者都为1,则对应位的结果为0。

例如:10的二进制数值为1010,15的二进制数值为1111,按位异或运算之后,结果为0101,即整数5;1的二进制数值为0001,0的二进制数值为0000,按位异或运算之后,结果为0001;1和1本身二进制位完全相同,因此结果为0。

例子:

SELECT 10 ^ 15, 1 ^ 0, 1 ^ 1, 2 ^ 2;

返回结果为:

image.png

1.4位左移运算符(<<)

位左移运算符<<使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:expr<<n。其中,n指定值expr要移位的位数。

例如:1的二进制值为0000 0001,左移两位之后变成0000 0100,即十进制整数4;十进制4左移两位之后变成0001 0000,即变成十进制的16。

例子:

SELECT 1<<2, 2<<1;

返回结果为:

image.png

1.5位右移运算符(>>)

位右移运算符>>使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。语法格式为:expr>>n。其中,n指定值expr要移位的位数。

例如:1的二进制值为0000 0001,右移1位之后变成0000 0000,即十进制整数0;16的二进制值为0001 0000右移两位之后变成0000 0100,即变成十进制的4。

例子:

SELECT 8>>2, 16>>2;

返回结果为:

image.png

1.6位取反运算符(~)

位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即1取反后变为0、0取反后变为1。

在逻辑运算5&~1中,由于位取反运算符‘~’的级别高于位与运算符‘&’,因此先对1进行取反操作,取反之后,除了最低位为0外其他位都为1,即1110,然后与十进制数值5进行与运算,结果为0100,即整数4。

提示: MySQL经过位运算之后的数值是一个64位的无符号整数,1的二进制数值表示为最右边位为1、其他位均为0,取反操作之后,除了最低位为0外,其他位均变为1。

例子:

SELECT ~16, ~8, 5 & ~1;

返回结果为:

image.png

2.运算符的优先级

运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。下表列出了MySQL中的各类运算符及其优先级。

Snipaste_2022-09-05_18-27-18.png

不同运算符的优先级是不同的。一般情况下,级别高的运算符先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。

总结

  • 6种位运算符
  • 运算符的优先级,在无法确定优先级的情况下,可以使用圆括号()来改变优先级

好了,今天阿文就介绍到这了...

022E89A8.gif