日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

14、MySQL位运算符

發(fā)布時間:2025/3/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 14、MySQL位运算符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所謂位運算,就是按照內存中的比特位(Bit)進行操作,這是計算機能夠支持的最小單位的運算。程序中所有的數據在內存中都是以二進制形式存儲的,位運算就是對這些二進制數據進行操作。

位運算一般用于操作整數,對整數進行位運算才有實際的意義。整數在內存中是以補碼形式存儲的,正數的補碼形式和原碼形式相同,而負數的補碼形式和它的原碼形式是不一樣的,這一點大家要特別注意;這意味著,對負數進行位運算時,操作的是它的補碼,而不是它的原碼

MySQL 中的整數字面量(常量整數,也就是直接書寫出來的整數)默認以 8 個字節(jié)(Byte)來表示,也就是 64 位(Bit)。例如,5 的二進制形式為:
0000 0000 … 0000 0101

省略號部分都是 0,101 前面總共有 61 個 0。

注意:為了方便大家閱讀,本節(jié)在介紹正數的補碼時,省略了前面的 0。

MySQL 支持 6 種位運算符,如下表所示。

位運算中的&、|、~和邏輯運算中的&&、||、!非常相似。

8 4 2 1

位或運算符 |

參與|運算的兩個二進制位有一個為 1 時,結果就為 1,兩個都為 0 時結果才為 0。例如1|1結果為 1,0|0結果為0,1|0結果為1,這和邏輯運算中的||非常類似。

例 1
使用位或運算符進行正數運算,SQL 語句如下:

mysql> SELECT 10|15,9|4|2; +-------+-------+ | 10|15 | 9|4|2 | +-------+-------+ | 15 | 15 | +-------+-------+

10 的補碼為 1010,15 的補碼為 1111,按位或運算之后,結果為 1111,即整數 15;9 的補碼為 1001,4 的補碼為 0100,2 的補碼為 0010,按位或運算之后,結果為 111,即整數 15。

例 2
使用位或運算符進行負數運算,SQL 語句如下:

mysql> SELECT -7|-1; +----------------------+ | -7|-1 | +----------------------+ | 18446744073709551615 | +----------------------+

-7 的補碼為 60 個‘1’加 1001,-1 的補碼為 64 個‘1’,按位或運算之后,結果為 64 個‘1’,即整數 18446744073709551615。

可以發(fā)現,任何數和 -1 進行位或運算時,最終結果都是 -1 的十進制數。

位與運算符 &

參與&運算的兩個二進制位都為 1 時,結果就為 1,否則為 0。例如1|1結果為 1,0|0結果為 0,1|0結果為 0,這和邏輯運算中的&&非常類似。

例 3
使用位與運算符進行正數運算,SQL 語句如下:

mysql> SELECT 10 & 15,9 & 4 & 2; +---------+-----------+ | 10 & 15 | 9 & 4 & 2 | +---------+-----------+ | 10 | 0 | +---------+-----------+

10 的補碼為 1010,15 的補碼為 1111,按位與運算之后,結果為 1010,即整數 10;9 的補碼為 1001,4 的補碼為 0100,2 的補碼為 0010,按位與運算之后,結果為 0000,即整數 0。

例 4
使用位與運算符進行負數運算,SQL 語句如下:

mysql> SELECT -7&-1; +----------------------+ | -7&-1 | +----------------------+ | 18446744073709551609 | +----------------------+

-7 的補碼為 60 個‘1’加 1001,-1 的補碼為 64 個‘1’,按位與運算之后,結果為 60 個‘1’加 1001,即整數 18446744073709551609。

可以發(fā)現,任何數和 -1 進行位與運算時,最終結果都為任何數本身的十進制數。

位異或運算符 ^

參與^運算的兩個二進制位不同時,結果為 1,相同時,結果為 0。例如1|1結果為 0,0|0結果為 0,1|0結果為1。

例 5
使用位異或運算符進行正數運算,SQL 語句如下:

mysql> SELECT 10^15,1^0,1^1; +-------+-----+-----+ | 10^15 | 1^0 | 1^1 | +-------+-----+-----+ | 5 | 1 | 0 | +-------+-----+-----+

10 的補碼為 1010,15 的補碼為 111,按位異或運算之后,結果為 0101,即整數 5;1 的補碼為 0001,0 的補碼為 0000,按位異或運算之后,結果為 0001;1 和 1 本身二進制位完全相同,因此結果為 0。

例 6
使用位異或運算符進行負數運算,SQL 語句如下:

mysql> SELECT -7^-1; +-------+ | -7^-1 | +-------+ | 6 | +-------+

-7 的補碼為 60 個‘1’加 1001,-1 的補碼為 64 個‘1’,按位異或運算之后,結果為 110,即整數 6。

位左移運算符 <<

位左移是按指定值的補碼形式進行左移,左移指定位數之后,左邊高位的數值被移出并丟棄,右邊低位空出的位置用 0 補齊。

位左移的語法格式為:

expr << n

其中,n 指定值 expr 要移位的位數,n 必須為非負數。

例 7
使用位左移運算符進行正數計算,SQL 語句如下:

mysql> SELECT 1<<2,4<<2; +------+------+ | 1<<2 | 4<<2 | +------+------+ | 4 | 16 | +------+------+

1 的補碼為 0000 0001,左移兩位之后變成 0000 0100,即整數 4;4 的補碼為 0000 0100,左移兩位之后變成 0001 0000,即整數 16。

例 8
使用位左移運算符進行負數計算,SQL 語句如下:

mysql> SELECT -7<<2; +----------------------+ | -7<<2 | +----------------------+ | 18446744073709551588 | +----------------------+

-7 的補碼為 60 個‘1’加 1001,左移兩位之后變成 56 個‘1’加 1110 0100,即整數 18446744073709551588。

位右移運算符 >>

位右移是按指定值的補碼形式進行右移,右移指定位數之后,右邊低位的數值被移出并丟棄,左邊高位空出的位置用 0 補齊。

位右移語法格式為:

expr >> n

其中,n 指定值 expr 要移位的位數,n 必須為非負數。

例 9
使用位右移運算符進行正數運算,SQL 語句如下:

mysql> SELECT 1>>1,16>>2; +------+-------+ | 1>>1 | 16>>2 | +------+-------+ | 0 | 4 | +------+-------+

1 的補碼為 0000 0001,右移 1 位之后變成 0000 0000,即整數 0;16 的補碼為 0001 0000,右移兩位之后變成 0000 0100,即整數 4。

例 10
使用位右移運算符進行負數運算,SQL 語句如下:

mysql> SELECT -7>>2; +---------------------+ | -7>>2 | +---------------------+ | 4611686018427387902 | +---------------------+

-7 的補碼為 60 個‘1’加 1001,右移兩位之后變成 0011 加 56 個‘1’加 1110,即整數 4611686018427387902。

位取反運算符 ~

位取反是將參與運算的數據按對應的補碼進行反轉,也就是做 NOT 操作,即 1 取反后變 0,0 取反后變?yōu)?1。

例 11
下面看一個經典的取反例子,對 1 進行位取反運算,具體如下所示:

mysql> SELECT ~1,~18446744073709551614; +----------------------+-----------------------+ | ~1 | ~18446744073709551614 | +----------------------+-----------------------+ | 18446744073709551614 | 1 | +----------------------+-----------------------+

常量 1 的補碼為 63 個‘0‘加 1 個’1‘,位取反后就是 63 個’1‘加一個’0‘,轉換為二進制后就是 18446744073709551614。

可以使用 BIN() 函數查看 1 取反之后的結果,BIN() 函數的作用是將一個十進制數轉換為二進制數,SQL 語句如下:

mysql> SELECT BIN(~1); +------------------------------------------------------------------+ | BIN(~1) | +------------------------------------------------------------------+ | 1111111111111111111111111111111111111111111111111111111111111110 | +------------------------------------------------------------------+

1 的補碼表示為最右邊位為 1,其他位均為 0,取反操作之后,除了最低位,其他位均變?yōu)?1。

例 12
使用位取反運算符進行運算,SQL 語句如下:

mysql> SELECT 5 & ~1; +--------+ | 5 & ~1 | +--------+ | 4 | +--------+

邏輯運算 5&~1 中,由于位取反運算符‘~’的級別高于位與運算符‘&’,因此先對 1 進行取反操作,結果為 63 個‘1’加一個‘0’,然后再與整數 5 進行與運算,結果為 0100,即整數 4。
< MySQL比較運算符

總結

以上是生活随笔為你收集整理的14、MySQL位运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。