91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

位運算在PHP 實際項目當中的運用是怎樣的

發布時間:2021-10-11 11:29:31 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

這篇文章給大家介紹位運算在PHP 實際項目當中的運用是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

來回顧一下這些基礎知識,同時也會講位運算在 PHP 實際項目當中的高級技巧。

一、位運算知識回顧

PHP 手冊當中,專門對位運算及位運算符進行了使用介紹。

https://www.php.net/manual/zh/language.operators.bitwise.php

1) 按位與運算符:&

之所以稱為位運算,指的是在運算過程中,我們會把兩組需要位運算的數值進行二進制化,然后兩組二進制的數字從低位向左對齊。這里的位指的是二進制數字的位置。而按位與運算符指的是兩組數值每一位相與,同為 1 則 結果為 1,否則為 0。

看 PHP 示例:

echo 1 & 3; // 輸出:1

為什么會輸出 1 呢?

那是因為:

1 的二進制表示結果為:01。

3 的二進制表示結果為:11。

那么這兩組二進制結果對齊之后的運算流程如下:

0111——01

從右往左進行位運算,都 為 1 則結果為1,否則為 0。結果自然是 01。而 01 轉換成十進制就是 1 。所以,輸出的結果為 1。

再看一組示例吧:

echo 2 & 10; // 輸出:2

我們來看看運算過程:

101010——————0010

0010 轉換成十進制就是 2。

一定要記得是向左對齊。或者稱為低位順位對齊模式。

如果你不會十進制轉二進制或二進制轉十進制不會。那么,下面這兩個方法能幫助你。

echo decbin(10); // 十進制轉二進制。echo bindec(10); // 二進制轉十進制。

2) 按位或運算符:|

這個跟上面的按位與運算符稍微有一點不同:只要兩組數字當中有只要有一位是 1 則結果就為 1。

看示例:

echo 2 | 10; // 輸出結果:10

運算過程:

101010——————1010

1010 的十進制結果就是 10。

3) 按位異或運算符:^

這個運算符比較有意思:兩組數字必須是一組 0 與 1 結果才為 1。1 與 1 和 0 與1 都是 0。

看示例:

echo 1 ^ 1; // 輸出結果:0echo 1 ^ 0; // 輸出結果:1

1 ^ 1 運算過程:

01
01
——
00

1 ^ 0 運算過程:

0100——01

這個很簡單。沒啥好說的。反正不相同就為 1,相同就為 0。

4) 其他位運算符:~、>>、<<

~ 按位取反運算符、>> 右移運算符、<< 左移運算符。它們的操作數都是一個。所以,與上面的兩個操作數的位運算符有著非常明顯的區別。在 PHP 實際編程當中,運用比較少。權當知識了解即可。

二、高級動用技巧

我們在上面對位運算符的知識進行了回顧。為的就是要在接下來的實際項目中怎樣運用它解決實際問題。

我們首先來看一個系統中常見的需求:

有一個廣告表,我們要對廣告做顯示控制:

  • 手動上下線。

  • 只允許 VIP 查看。

可能的表結構如下:

CREATE TABLE `finger_ad` (
  `ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `ad_name` varchar(50) NOT NULL COMMENT '廣告名稱',
  `ad_image_url` varchar(255) NOT NULL COMMENT '廣告圖片',
  `ad_url` varchar(255) NOT NULL COMMENT '廣告圖片URL跳轉地址',
  `is_vip` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否僅限 VIP 顯示',
  `display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '顯示狀態:1顯示、0隱藏',
  PRIMARY KEY (`ad_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='廣告表';

假如后期,我們需求更改了。需要再增加幾種限制:

  • 已登錄用戶

  • 未登錄用戶

  • 30 天內未登錄用戶

  • 注冊 30 天的用戶

遇到這種限制條件的需求,開發同學是不是很傷腦筋?

可能很多開發第一反應就是在表結構增加這種新增的限制條件字段。一切看來似乎很美好。

的確,這樣添加字段是最快最容易的方式。也能完成我們的需求。

但是,這樣會引來如下毛病:

  • 每次增加限制條件。我們都要增加字段。這種對數據庫的更動能少改就少改。畢竟,無限制的增加字段不可取。

  • 假如廣告表數據量很大。大到增加一個字段需要幾分鐘的時候,這會給數據庫服務器造成讀寫壓力。

  • 條件越多,SQL 條件語句就會越來越長。

那么,還有沒有更好的方式解決這些問題呢?

答案:有!

這就是我們今天要講的按位與運算符的高級技巧。

我們把上面的表結構改一下:

DROP TABLE IF EXISTS `finger_ad`;CREATE TABLE `finger_ad` (
  `ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `ad_name` varchar(50) NOT NULL COMMENT '廣告名稱',
  `ad_image_url` varchar(255) NOT NULL COMMENT '廣告圖片',
  `ad_url` varchar(255) NOT NULL COMMENT '廣告圖片URL跳轉地址',
  `bit_condition` INT(11) UNSIGNED NOT NULL COMMENT '位運算條件:1-登錄可訪問、2-未登錄可訪問、4-30天注冊可訪問、8-30天未登錄可訪問、16-未消費可訪問、32-VIP可訪問',
  `display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '顯示狀態:1顯示、0隱藏',
  PRIMARY KEY (`ad_id`)) ENGINE=InnoDB DEFAULT CHARSET UTF8 COMMENT='廣告表';

我們把所有的條件都去掉了。增加了一個字段: bit_condition 。把所有的條件都組合到一個字段。

那我們此時該如何寫代碼呢?

比如,現在要添加如下限制條件的廣告:

只允許登錄用戶訪問或已注冊 30 天用戶或是 VIP 用戶才允許訪問該廣告。

那么,這個廣告的 bit_condition 該如何設置值呢?很簡單,把這幾個條件的位值直接相加。此時值為:37。

很多可能會很奇怪。設置為 37 ,我怎么知道是這幾個值的和呢?如果對 Linux 系統權限熟悉的同學就很容易理解這種做法。實際上,這里運用了按位與運算的特性:任意組合相加的值不會重復。

這個理解起來有一定難度。我三兩句也很難給你梳理明白。大家可以在網上深入挖掘一下這方面兒的知識。你只需要知道這一點特點即可。

那么,現在我們該如何寫 SQL 呢?

示例如下:

SELECT * FROM finger_ad WHERE display = 1 AND bit_condition & 3 = bit_condition

這條 SQL 語句當中的 3 對應的是當前用戶針對這么多條件得到的數值。如果 bit_condition位值是與 3 按位與與 bit_condition 結果相同,說明條件符合。

我們通過一個字段解決了所有條件的問題。著實得感謝按位與運算符的特性。同時也對 MySQL能支持位運算符感到開心。

那么,它有什么缺點呢?

想必有經驗的同學已經看出來了。這種寫法只能滿足包含關系。假如要實現同時滿足 3 個條件才能訪問就不行了。或者,一個滿足另外一個取反。

優點明顯,同樣缺點也很明顯。大家要根據實際情況來選用。

關于位運算在PHP 實際項目當中的運用是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

晋江市| 宁晋县| 积石山| 彩票| 长治市| 浦北县| 固原市| 卢龙县| 宿松县| 铜陵市| 武清区| 馆陶县| 福贡县| 平武县| 长宁县| 扎赉特旗| 高碑店市| 昌平区| 米林县| 韶山市| 平泉县| 驻马店市| 高碑店市| 东兰县| 富川| 沁水县| 潜山县| 湖北省| 靖边县| 城步| 敦化市| 酒泉市| 潼关县| 比如县| 吉木萨尔县| 株洲市| 滕州市| 花莲县| 苏尼特右旗| 饶阳县| 革吉县|