MySQL位运算符-树叶云数据库教程 (mysql伪列)

教程大全 2025-07-07 17:27:46 浏览

所谓位运算,就是按照内存中的比特位(Bit)进行操作,这是计算机能够支持的最小单位的运算。程序中所有的数据在内存中都是以二进制形式存储的,位运算就是对这些二进制数据进行操作。

位运算一般用于操作整数,对整数进行位运算才有实际的意义。整数在内存中是以补码形式存储的,正数的补码形式和原码形式相同,而负数的补码形式和它的原码形式是不一样的,这一点大家要特别注意;这意味着,对负数进行位运算时,操作的是它的补码,而不是它的原码。

对整数存储不了解的读者请猛击《整数在内存中是如何存储的,为什么它堪称天才般的设计》。

MySQL 中的整数字面量(常量整数,也就是直接书写出来的整数)默认以 8 个字节(Byte)来表示,也就是 64 位(Bit)。例如,5 的二进制形式为:

0000 0000 … 0000 0101

省略号部分都是 0,101 前面总共有 61 个 0。

注意:为了方便大家阅读,本节在介绍正数的补码时,省略了前面的 0。

MySQL 支持 6 种位运算符,如下表所示。

MySQL 中的位运算符
运算符 说明 使用形式 举例
位或
位与
位异或
位取反
位左移 5 << 2,表示整数 5按位左移 2 位
位右移 5 >> 2,表示整数 5 按位右移 2 位

位运算中的、、和逻辑运算中的、、非常相似。

位或运算符 |

参与运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如结果为 1,结果为0,结果为1,这和逻辑运算中的非常类似。

例 1

使用位或运算符进行正数运算,SQL 语句如下:

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

10 的补码为 1010,15 的补码为 1111,按位或运算之后,结果为 1111,即整数 15;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位或运算之后,结果为 111,即整数 15。

例 2

使用位或运算符进行负数运算,SQL 语句如下:

mysql> SELECT -7|-1;+----------------------+| -7|-1|+----------------------+| 18446744073709551615 |+----------------------+1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位或运算之后,结果为 64 个‘1’,即整数 18446744073709551615。

可以发现, 任何数和 -1 进行位或运算时,最终结果都是 -1 的十进制数

位与运算符 &

参与运算的两个二进制位都为 1 时,结果就为 1,否则为 0。例如结果为 1,结果为 0,结果为 0,这和逻辑运算中的非常类似。

例 3

使用位与运算符进行正数运算,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。

例 4

使用位与运算符进行负数运算,SQL 语句如下:

mysql> SELECT -7&-1;+----------------------+| -7&-1|+----------------------+| 18446744073709551609 |+----------------------+1 row in set (0.01 sec)

-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位与运算之后,结果为 60 个‘1’加 1001,即整数 18446744073709551609。

可以发现, 任何数和 -1 进行位与运算时,最终结果都为任何数本身的十进制数

位异或运算符 ^

参与运算的两个二进制位不同时,结果为 1,相同时,结果为 0。例如结果为 0,结果为 0,结果为1。

例 5

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

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

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

例 6

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

mysql> SELECT -7^-1;+-------+| -7^-1 |+-------+|6 |+-------+1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位异或运算之后,结果为 110,即整数 6。

位左移运算符 <<

my伪列

位左移是按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐。

位左移的语法格式为:

其中,n 指定值 expr 要移位的位数,n 必须为非负数。

例 7

使用位左移运算符进行正数计算,SQL 语句如下:

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

1 的补码为 0000 0001,左移两位之后变成 0000 0100,即整数 4;4 的补码为 0000 0100,左移两位之后变成 0001 0000,即整数 16。

例 8

使用位左移运算符进行负数计算,SQL 语句如下:

mysql> SELECT -7<<2;+----------------------+| -7<<2|+----------------------+| 18446744073709551588 |+----------------------+1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,左移两位之后变成 56 个‘1’加 1110 0100,即整数 18446744073709551588。

位右移运算符 >>

位右移是按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。

位右移语法格式为:

其中,n 指定值 expr 要移位的位数,n 必须为非负数。

例 9

使用位右移运算符进行正数运算,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。

例 10

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

mysql> SELECT -7>>2;+---------------------+| -7>>2|+---------------------+| 4611686018427387902 |+---------------------+1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,右移两位之后变成 0011 加 56 个‘1’加 1110,即整数 4611686018427387902。

位取反运算符 ~

位取反是将参与运算的数据按对应的补码进行反转,也就是做 NOT 操作,即 1 取反后变 0,0 取反后变为 1。

例 11

下面看一个经典的取反例子,对 1 进行位取反运算,具体如下所示:

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

常量 1 的补码为 63 个‘0‘加 1 个’1‘,位取反后就是 63 个’1‘加一个’0‘,转换为二进制后就是 18446744073709551614。

可以使用 BIN() 函数查看 1 取反之后的结果,BIN() 函数的作用是将一个十进制数转换为二进制数,SQL 语句如下:

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

1 的补码表示为最右边位为 1,其他位均为 0,取反操作之后,除了最低位,其他位均变为 1。

例 12

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

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

逻辑运算中,由于位取反运算符‘~’的级别高于位与运算符‘&’,因此先对 1 进行取反操作,结果为 63 个‘1’加一个‘0’,然后再与整数 5 进行与运算,结果为 0100,即整数 4。


关于C语言的问题

不知道你看的是什么书,会不会是你看错了。 对于&&运算符,必须2个操作数都为1,结果才为1,所以只要第1个操作数为0,就不用再计算第2个了。 而对于||运算符,只要有1个操作数为1,结果就为1,所以只要第1个操作数为1,就不用再计算第2个了。 如果第1个操作数为0,那么当然还要计算第2个才能知道结果。

php程序,求答案

答案:4,14,4if( ($a = 3) > 0 | ($b = 3) > 0 ):将$a赋值为3,判断$a是否大于0,$a为3,显然是大于0的,||表示“或者”,因为前面已经成立,后面的就不执行了,$b仍然是0,执行循环中的代码:$a++,$b++分别将$a,$b加1,即得到$a=4,$b=1if( ($a = 3) > 0 | ($b = 3) > 0 )同理将a赋值为3,判断$a是否大于0,$a为3,显然是大于0的,|是位运算符“按位或”,右面将$b赋值为3,3换成二进制为 0011 | 0011 ==0011,即3 所以 if( ($a = 3) > 0 | ($b = 3) > 0 )即为if(3),就是if(3!=0)是成立的,执行循环中的代码$a++,$b++分别将$a,$b加1,即得到$a=4,$b=4 注意位运算符和逻辑运算符的区别 注:printf(\n)换成echo

c语言 lne怎么 表示

C语言的logx是以e为底的相当于lnx,如果以其他数作为对数的底,假设要计算log3(9)的值,必须写成float ii=log(9)/log(3);

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐