当前位置:嗨网首页>书籍在线阅读

14-位运算符

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.3.5 位运算符

位运算符是用来对二进制字节中的位进行测试、位移或者测试处理,MySQL中提供的位运算符有:按位或(|),按位与(&),按位异或(^),按位左移(<<),按位右移(>>),按位取反(~),如下表所示。

Figure-0174-158.jpg 接下来,分别讨论不同的位运算符的使用方法。

1.位或运算符“|”

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

【范例6-48】

使用位或运算符进行运算,SQL语句如下。

mysql> SELECT 10|15,9|4|2; +-------+-------+ | 10|15 | 9|4|2 | +-------+-------+ | 15| 15| +-------+-------+ 1 row in set (0.04 sec)

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

2.位与运算符“&”

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

【范例6-49】

使用位与运算符进行运算,SQL语句如下。

mysql> SELECT 10 & 15, 9 & 4 & 2; +---------+-----------+ | 10 & 15 | 9 & 4 & 2 | +---------+-----------+ | 10| 0| +---------+-----------+ 1 row in set (0.00 sec)

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

3.位异或运算符“^”

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

【范例6-50】

使用位异或运算符进行运算,SQL语句如下。

mysql> SELECT 10^15,1^0,1^1; +-------+-----+-----+ | 10^15 | 1^0 | 1^1 | +-------+-----+-----+ | 5| 1| 0| +-------+-----+-----+ 1 row in set (0.01 sec)

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

4.位左移运算符“<<”

位左移运算符“<<”的功能是让指定二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:a<<n。这里的n指定值a要移动的位置。

【范例6-51】

使用位左移运算符进行运算,SQL语句如下。

mysql> SELECT 1<<2,4<<2; +------+------+ | 1<<2 | 4<<2 | +------+------+ | 4| 16| +------+------+ 1 row in set (0.01 sec)

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

5.位右移运算符“>>”

位右移运算符“>>”的功能是让指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。语法格式为:语法格式为:a>>n。这里的n指定值a要移动的位置。

【范例6-52】

使用位右移运算符进行运算,SQL语句如下。

mysql> SELECT 1>>1,16>>2; +------+-------+ | 1>>1 | 16>>2 | +------+-------+ | 0| 4| +------+-------+ 1 row in set (0.00 sec)

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

6.位取反运算符“~”

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

【范例6-53】

使用位取反运算符进行运算,SQL语句如下。

mysql> SELECT 5&~1; +-------+ | 5 &~1 | +-------+ | 4| +-------+ 1 row in set (0.02 sec)

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

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

mysql> SELECT BIN(~1); +------------------------------------------------------------------+ |BIN(~1) | +------------------------------------------------------------------+ | 1111111111111111111111111111111111111111111111111111111111111110 | +------------------------------------------------------------------+ 1 row in set (0.00 sec)

7.运算符的优先级

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

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